2014-10-17 13 views
13

Sto utilizzando la libreria di menudrawer nel mio progetto (questo: https://github.com/SimonVT/android-menudrawer).Cassetto di navigazione (Menudrawer) stile Android 5 (lecca-lecca)

Sto aggiornando la mia app per essere compatibile con API21 (Android 5 Lollipop) e Material Design. Quando si utilizza questa libreria con l'icona di menudrawer API21 sembra scadente.

Desidero ottenere la transizione che è possibile visualizzare nel nuovo Play Store (nuova icona dell'icona del menudrawing alla freccia).

Play Store navigation drawer icon

Qual è il modo migliore per farlo? È possibile con questa libreria? L'unica soluzione che sto pensando al momento è personalizzabile. Ma forse posso usare il drawable nativo in qualche modo?

+0

Perché non stai usando la libreria appcompat-v7 in Android 5.0 SDK? Ha questa animazione integrata. – alanv

+0

@alanv ma per usare appcompat-v7 vuoi dire - rimuovi menudrawer dal mio progetto e usa quello nativo? Al momento questo è problematico. – adek

+0

Voglio dire usare il DrawerLayout dalla libreria di supporto. Sembra che Menudrawer offra le stesse caratteristiche, ma DrawerLayout è pensato per funzionare ActionBarDrawerToggle (che è ciò che fornisce questa animazione). – alanv

risposta

41

OK. Ho trascorso alcune ore con la nuova API e penso che il meglio per me sarà riscrivere il mio cassetto da lib a DrawerLayout nativo.

Ma forse questo sarà utile per qualcuno con problemi simili. Ho creato un progetto di prova con DrawerLayout (Android Studio -> Nuovo progetto con menudrawer).

E poi ho visto lo stesso problema. Icona sbagliata Se vuoi vedere animazioni fantasiose e una buona icona per Android 5.0 assicurati di utilizzare:

import android.support.**v7**.app.ActionBarDrawerToggle; 

Prendere nota su v7. Di default la classe Fragment ha l'importazione v4 e quindi non vedrai una buona icona.

Un'altra cosa. Dopo il passaggio alla v7, è necessario correggere la funzione ActionBarDrawerToggle con il nuovo costruttore. E questo è tutto. Vedrai l'icona di un nuovo cassetto.

+2

La versione v4 di ActionBarDrawerToggle è deprecata. Vedi http://developer.android.com/reference/android/support/v4/app/ActionBarDrawerToggle.html. –

+0

@adek: funziona anche per i dispositivi con Android api level 10? o dobbiamo codificare separatamente per l'effetto di transizione in questi livelli di API? –

+0

@ Rat-a-tat-a-tatRatatouille buona domanda. Ho letto che dovrebbe funzionare con API10. Lo sto usando con 14+ al momento. – adek

19

Innanzitutto, assicurarsi di aggiornare l'ultimo SDK. Crea un nuovo progetto in Android Studio, quindi aggiungi le librerie appcompat-v7.21.0. + E appcompat-v4.21.0. + Nel tuo buid.gradle come dipendenza gradle.

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

Aggiungi primaryColor e primarycolorDark nel file color.xml.

<resources> 
<color name="primaryColor">#2196F3</color> 
<color name="primaryColorDark">#0D47A1</color> 
</resources> 

Aggiungi cassetto apri/chiudi il valore stringa nel file 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> 

Il file di layout activity_my.xml assomiglia a questo:

<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> 

Il file di layout toolbar.xml si presenta così:

<?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> 

tuo MyActivity.java assomiglia a questo: Qui la tua attività deve estendere ActionBarActivity e impostare la barra degli strumenti come barra di azione di supporto.

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); 
} 
} 

creare il file style.xml nei valori-21 cartella per 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> 

Create il vostro stile.file xml nella cartella valori per le versioni precedenti di Android lecca-lecca poi

<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> 

tuo AndroidManifest.xml è simile a questo:

<?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> 

Per riferimento soltanto: è possibile codice per il download completo fonte da qui: click here

Problemi correlati