15

Sto utilizzando un Nexus 7 con build di anteprima di Android 5.0.Indicatore del cassetto nel negozio di giochi lollipop

In questa pagina http://developer.android.com/tools/support-library/index.html

vedo

Modifiche per V7 biblioteca appcompat: Aggiornato ActionBarDrawerToggle, che contiene l'animazione menù-to-freccia

È questo ciò che il L'app Google Play utilizza? Sto leggendo troppo in questa affermazione? Cosa devo cambiare per ottenere questo comportamento: non riesco a trovarlo nella documentazione dell'API.

+0

Sì, lo è, e basta usare ActionBarDrawerToggle da appcompat-V7 (non quello vecchio da supporto-v4) con l'indicatore di default su. – alanv

risposta

12

È molto semplice.

Il layout con DrawerLayout è lo stesso di sempre. Si utilizza android.support.v4.widget.DrawerLayout e creare cassetti e area del contenuto:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/drawerLayout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<RelativeLayout 
    android:id="@+id/content_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#ff0" 
    android:orientation="vertical" > 
</RelativeLayout> 

<ListView 
    android:id="@+id/leftDrawer" 
    android:layout_width="290dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:background="#f0f" 
    android:choiceMode="singleChoice" 
    android:clickable="true" 
    android:divider="@null" 
    android:dividerHeight="0dp" 
    android:scrollbars="none" /> 

modifiche principali sono nel codice Java. Nella tua attività, dove usi il layout del cassetto, devi estenderlo per ActionBarActivity dalla v7. Quindi si creano variabili per DrawerLayout e ActionBarDrawerToggle. Le tue importazioni dovrebbero apparire così:

import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.ActionBarActivity; 

e quindi collegare tutto. Ricorda che il nuovo layout del cassetto non ha un'icona! Non lo passi dove dovresti essere normalmente. Codice per la mia attività:

import android.content.res.Configuration; 
import android.os.Bundle; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.ActionBarActivity; 
import android.view.MenuItem; 

public class MainActivity extends ActionBarActivity { 

    DrawerLayout drawerLayout; 
    ActionBarDrawerToggle drawerToggle; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout); 
     drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.app_name, R.string.app_name) {}; 

     drawerLayout.setDrawerListener(drawerToggle); 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setHomeButtonEnabled(true); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     if (drawerToggle.onOptionsItemSelected(item)) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

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

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

} 

E dovrebbe funzionare.

+0

Sta usando la compatibilità ActionBarActivity necessaria? –

+0

Se si utilizza il widget 'Toolbar' dalla libreria di supporto e il tema' NoActionBar' si dovrebbe usare 'ActionBarActivity', per usare il metodo' setActionBar (Toolbar) '. In entrambi i casi si dovrebbe usare se si desidera supportare versioni precedenti. –

+0

grazie amico per la condivisione :) – user3307005

23

ho postato un'applicazione di esempio qui che utilizza la nuova classe Toolbar e ActionBarToggle di fornire un ActionBar con l'icona di stile animatrice Play Store:

https://github.com/03lafaye/LollipopDrawerToggle

Il ramo non-v7-support utilizza la ActionBarToggle con un'attività e barra degli strumenti framework. Il ramo principale utilizza la barra degli strumenti v7 e ActionBarActivity.

La configurazione per non usare un ActionBarActivity assomiglia a questo:

package com.plafayette.lollipop; 

import android.app.Activity; 
import android.support.v4.widget.DrawerLayout; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 

public class ToolbarActivity extends Activity { 
    private ActionBarDrawerToggle toggle; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_toolbar); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setActionBar(toolbar); 

     DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     toggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.open, R.string.close); 
     toggle.setDrawerIndicatorEnabled(true); 
     drawerLayout.setDrawerListener(toggle); 
    } 

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

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

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     if (toggle.onOptionsItemSelected(item)) 
      return true; 

     int id = item.getItemId(); 
     return id == R.id.action_settings || super.onOptionsItemSelected(item); 
    } 
} 

Si noti che è necessario disattivare l'ActionBar finestra e barra del titolo nel tema in questo modo:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="AppTheme" parent="android:Theme.Material.Light"> 
     <item name="android:windowActionBar">false</item> 
     <item name="android:windowNoTitle">true</item> 
    </style> 
</resources> 

Immagino che il codice di esempio per l'ultima libreria appcompat v7 sarà rilasciato abbastanza presto rendendo questo post obsoleto.

Chris Renke di Square ha pubblicato un backport alternativo dell'animazione dell'icona su. Il codice è su GitHub qui: https://github.com/ChrisRenke/DrawerArrowDrawable e ha scritto un blog a riguardo allo http://chrisrenke.com/drawerarrowdrawable.

+0

Grazie mille, davvero utile !!! – Jaydeep

+0

Come si ottiene che l'icona del cassetto NON si trasformi in freccia indietro quando viene selezionato un elemento del cassetto? Voglio che l'icona rimanga la stessa in tutti i frammenti del cassetto. – Sndn

9

Sembra che tu abbia un cassetto funzionante mentre lo leggo, in caso contrario, lo Documentation on "Creating a Navigation Drawer" è piuttosto buono.

Aggiornato ActionBarDrawerToggle, che contiene l'animazione menù-to-freccia

enter image description here

La citazione di cui sopra si riferisce a Create a new ActionBarDrawerToggle with arrow and hamburger menu commit. Come relativo: setDrawerIndicatorEnabled è stato aggiunto in Add ability to disable drawer indicator in new ArrowDrawer.

Quindi assicuratevi setDrawerIndicatorEnabled non si chiama con false e utilizzare

import android.support.v7.app.ActionBarDrawerToggle; 

invece di

import android.support.v4.app.ActionBarDrawerToggle; 

che dovrebbe essere abbastanza evidente dal warning di deprecazione in ogni caso:

@deprecated prega usa ActionBarDrawerToggle in support-v7-appcompat.

probabilmente bisogno

// <item name="displayOptions">showHome|homeAsUp</item> 
getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
getSupportActionBar().setDisplayShowHomeEnabled(true); 
8

prima cosa, assicurarsi di aggiornare al più recente 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 file di style.xml nella cartella valori-21 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> 

creare il file nella cartella style.xml valori per le versioni precedenti, allora 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> 

tuo AndroidManifest.xml è simile a questa:

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

+0

molto grazie.working multa :) – Steve

10

Partenza here

enter image description here

MainActivity.java :

package com.poliveira.apps.materialtests; 

import android.os.Bundle; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.widget.Toast; 


public class MainActivity extends ActionBarActivity implements NavigationDrawerCallbacks { 

    private Toolbar mToolbar; 
    private NavigationDrawerFragment mNavigationDrawerFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar); 
     setSupportActionBar(mToolbar); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 

     mNavigationDrawerFragment = (NavigationDrawerFragment) getFragmentManager().findFragmentById(R.id.fragment_drawer); 
     mNavigationDrawerFragment.setup(R.id.fragment_drawer, (DrawerLayout) findViewById(R.id.drawer), mToolbar); 
    } 

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

    @Override 
    public void onNavigationDrawerItemSelected(int position) { 
     Toast.makeText(this, "Menu item selected -> " + position, Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onBackPressed() { 
     if (mNavigationDrawerFragment.isDrawerOpen()) 
      mNavigationDrawerFragment.closeDrawer(); 
     else 
      super.onBackPressed(); 
    } 
} 

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <include 
     android:id="@+id/toolbar_actionbar" 
     layout="@layout/toolbar_default" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

    <android.support.v4.widget.DrawerLayout 
     android:id="@+id/drawer" 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/toolbar_actionbar"> 

     <FrameLayout 
      android:id="@+id/container" 
      android:layout_width="match_parent" 
      android:clickable="true" 
      android:layout_height="match_parent"/> 

     <!-- android:layout_marginTop="?android:attr/actionBarSize"--> 
     <fragment 
      android:id="@+id/fragment_drawer" 
      android:name="com.poliveira.apps.materialtests.NavigationDrawerFragment" 
      android:layout_width="@dimen/navigation_drawer_width" 
      android:layout_height="match_parent" 
      android:layout_gravity="start" 
      app:layout="@layout/fragment_navigation_drawer"/> 
    </android.support.v4.widget.DrawerLayout> 
</RelativeLayout> 
+2

Questa a mio parere è la migliore risposta per la domanda, diretta al punto con un link di progetto pulito – Maya

+0

Hai bisogno di utilizzare lo stesso layout e la stessa implementazione di classe se hai bisogno di muoverti da questa attività a un'altra? Ad esempio, ho bisogno di estendere la nuova attività per essere basata sulla barra di azione se volessi visualizzare la barra delle azioni nella nuova attività? – Maya

+0

@Maya Non ti ho preso. Devi implementare nel modo giusto per ottenere il risultato previsto – Steve