2014-10-17 8 views
13

Ich benutze menudrawer Bibliothek in meinem Projekt (dieses: https://github.com/SimonVT/android-menudrawer).Navigationsschublade (menudrawer) Android 5 (Lollipop) Stil

Ich aktualisiere meine App, um mit API21 (Android 5 Lollipop) und Material Design kompatibel zu sein. Wenn Sie diese Bibliothek mit API21 verwenden, sieht das menudrawer-Symbol schlecht aus.

Ich möchte einen Übergang erreichen, den Sie im neuen Play Store sehen können (neues menudrawer Icon Übergang zum Pfeil).

Play Store navigation drawer icon

Was ist der beste Weg, das zu tun? Ist es mit dieser Bibliothek möglich? Die einzige Lösung, die ich im Moment denke, ist benutzerdefinierte Zeichnungsoptionen. Aber vielleicht kann ich native Zeichen in irgendeiner Weise verwenden?

+0

Warum Sie nicht die appcompat-v7-Bibliothek im SDK 5.0 mit Android? Es hat diese Animation eingebaut. – alanv

+0

@alanv aber um appcompat-v7 zu verwenden meinst du - remove menudrawer von meinem Projekt und benutze das native? Im Moment ist das problematisch. – adek

+0

Ich meine die Verwendung der DrawerLayout aus der Support-Bibliothek. Es sieht so aus, als ob menudrawer exakt die gleichen Funktionen bietet, aber DrawerLayout soll ActionBarDrawerToggle funktionieren (was diese Animation bietet). – alanv

Antwort

41

OK. Ich habe einige Stunden mit der neuen API verbracht und denke, dass das Beste für mich darin besteht, meine Schublade von lib auf natives DrawerLayout umzuschreiben.

Aber vielleicht wird dies für jemanden mit einem ähnlichen Problem nützlich sein. Ich habe Testprojekt mit DrawerLayout erstellt (Android Studio -> Neues Projekt mit menudrawer).

Und dann sah ich das gleiche Problem. Falsches Symbol Wenn Sie sehen wollen, Phantasie und gute Symbol für Android 5.0 stellen Sie sicher, dass Sie verwenden:

Beachten Sie auf v7. Standardmäßig hat die Fragment-Klasse einen v4-Import und dann wird kein gutes Symbol angezeigt.

Eine andere Sache. Nach dem Wechsel zu v7 müssen Sie die Funktion ActionBarDrawerToggle an den neuen Konstruktor anpassen. Und das ist es. Sie werden ein neues Schubladensymbol sehen.

+2

Die Version 4 von ActionBarDrawerToggle ist veraltet. Siehe http://developer.android.com/reference/android/support/v4/app/ActionBarDrawerToggle.html. –

+0

@adek - das funktioniert auch für Geräte mit Android API-Ebene 10 ist das? Oder müssen wir den Übergangseffekt in diesen API-Ebenen getrennt programmieren? –

+0

@ Rat-a-tat-a-tatRatatouille gute Frage. Ich habe gelesen, dass es mit API10 funktionieren sollte. Ich benutze es gerade mit 14+. – adek

19

Stellen Sie zuerst sicher, dass Sie auf das neueste SDK aktualisieren. Erstellen Sie ein neues Projekt in Android Studio und fügen Sie dann die Bibliotheken appcompat-v7.21.0. + Und appcompat-v4.21.0. + In Ihrem buid.gradle als Graddle-Abhängigkeit hinzu.

compile 'com.android.support:appcompat-v7:21.0.2' 
compile 'com.android.support:support-v4:21.0.2' 

Fügen Sie primaryColor und primarycolorDark in Ihrer color.xml-Datei hinzu.

Fügen Sie Zeichenkette öffnen/schließen Zeichenfolge in Ihrer Datei strings.xml.

<resources> 
<string name="app_name">Lollipop Drawer</string> 
<string name="action_settings">Settings</string> 
<string name="drawer_open">open</string> 
<string name="drawer_close">close</string> 
</resources> 

Ihre activity_my.xml Layout-Datei sieht wie folgt aus:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:orientation="vertical" 
android:layout_height="match_parent" 
tools:context=".MainActivity"> 

<include layout="@layout/toolbar" /> 


<android.support.v4.widget.DrawerLayout 
    android:layout_width="match_parent" 
    android:id="@+id/drawerLayout" 
    android:layout_height="match_parent"> 

    <!-- activity view --> 
    <RelativeLayout 
     android:layout_width="match_parent" 
     android:background="#fff" 
     android:layout_height="match_parent"> 

     <TextView 
      android:layout_centerInParent="true" 
      android:layout_width="wrap_content" 
      android:textColor="#000" 
      android:text="Activity Content" 
      android:layout_height="wrap_content" /> 
    </RelativeLayout> 

    <!-- navigation drawer --> 
    <RelativeLayout 
     android:layout_gravity="left|start" 
     android:layout_width="match_parent" 
     android:background="#fff" 
     android:layout_height="match_parent"> 

     <ListView 
      android:id="@+id/left_drawer" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:divider="#eee" 
      android:background="#fff" 
      android:dividerHeight="1dp" /> 
    </RelativeLayout> 

</android.support.v4.widget.DrawerLayout> 

</LinearLayout> 

Ihre toolbar.xml Layout-Datei wie folgt aussieht:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/toolbar" 
android:minHeight="?attr/actionBarSize" 
android:background="?attr/colorPrimary" 
android:layout_width="match_parent" 
android:layout_height="wrap_content"> 

</android.support.v7.widget.Toolbar> 

Ihre MyActivity.java wie folgt aussieht: Hier muss Ihre Aktivität ActionBarActivity erweitern und Ihre Symbolleiste als Support-Aktionsleiste festlegen.

import android.content.res.Configuration; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class MyActivity extends ActionBarActivity { 

private Toolbar toolbar; 
private DrawerLayout drawerLayout; 
private ActionBarDrawerToggle drawerToggle; 
private ListView leftDrawerList; 
private ArrayAdapter<String> navigationDrawerAdapter; 
private String[] leftSliderData = {"Home", "Android", "Sitemap", "About", "Contact Me"}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_my); 
    nitView(); 
    if (toolbar != null) { 
     toolbar.setTitle("Navigation Drawer"); 
     setSupportActionBar(toolbar); 
    } 
    initDrawer(); 
} 

private void nitView() { 
    leftDrawerList = (ListView) findViewById(R.id.left_drawer); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout); 
    navigationDrawerAdapter=new ArrayAdapter<String>(MyActivity.this, android.R.layout.simple_list_item_1, leftSliderData); 
    leftDrawerList.setAdapter(navigationDrawerAdapter); 
} 

private void initDrawer() { 

    drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) { 

     @Override 
     public void onDrawerClosed(View drawerView) { 
      super.onDrawerClosed(drawerView); 

     } 

     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 

     } 
    }; 
    drawerLayout.setDrawerListener(drawerToggle); 
} 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    drawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    drawerToggle.onConfigurationChanged(newConfig); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.my, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    if (drawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
} 

erstellen style.xml Datei in Werte-21 Ordner für Android Lollipop

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

<style name="myAppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="colorPrimary">@color/primaryColor</item> 
    <item name="colorPrimaryDark">@color/primaryColorDark</item> 
    <item name="android:statusBarColor">@color/primaryColorDark</item> 

    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> 
</style> 

<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> 
    <item name="spinBars">true</item> 
    <item name="color">@android:color/black</item> 
</style> 

</resources> 

Stil erstellen.XML-Datei in Werte Ordner für ältere Versionen dann Android Lollipop

<resources> 

<style name="myAppTheme" parent="Theme.AppCompat.Light"> 
    <item name="colorPrimary">@color/primaryColor</item> 
    <item name="colorPrimaryDark">@color/primaryColorDark</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="windowActionBar">false</item> 
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> 
</style> 

<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> 
    <item name="spinBars">true</item> 
    <item name="color">@android:color/black</item> 
</style> 

</resources> 

Ihr AndroidManifest.xml ist wie folgt aussieht:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="nkdroid.com.lollipopdrawer" > 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/myAppTheme" > 
    <activity 
     android:name=".MyActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 

Nur als Referenz: Sie können herunterladen vollständigen Quellcode von hier: click here

Verwandte Themen