Barra de herramientas de soporte de Android + ActionBarDrawerToggle no cambia a flecha

Estoy luchando con la barra de herramientas y el cajón. Estoy tratando de hacer que la hamburguesa cambie a flecha cuando estoy agregando un nuevo fragmento al backstack pero no hay manera de hacerlo.

Tal vez estoy perdiendo algo, pero no pude encontrar una manera. ¿Alguien tuvo el mismo problema?

Esta es la declaración:

mDrawerToggle = new ActionBarDrawerToggle( getActivityCompat(), /* host Activity */ mDrawerLayout, /* DrawerLayout object */ ((BaseActivity) getActivityCompat()).getToolbar(), R.string.navigation_drawer_open, /* "open drawer" description for accessibility */ R.string.navigation_drawer_close /* "close drawer" description for accessibility */ ) 

Esta es la función que llamo cuando se agrega un fragmento a la pila trasera

 public void setToggleState(boolean isEnabled) { if (mDrawerLayout == null) return; if (isEnabled) { mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); mDrawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED); } else { mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); mDrawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); } mDrawerToggle.syncState(); } 

Creo que todo lo que tienes que hacer es eliminar el tercer argumento. Así:

 mDrawerToggle = new ActionBarDrawerToggle( getActivityCompat(), /* host Activity */ mDrawerLayout, /* DrawerLayout object */ // ((BaseActivity) getActivityCompat()).getToolbar(), <== delete this argument R.string.navigation_drawer_open, /* "open drawer" description for accessibility */ R.string.navigation_drawer_close /* "close drawer" description for accessibility */ ); 

Que ayude.

Yo tuve el mismo problema. Mi solución fue la siguiente:

Asegúrese de que su actividad implementa onBackStackChangedListener. En sus actividades 'onCreate establezco el escucha de backstack y configuro la barra de herramientas

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mFm = getFragmentManager(); mFm.addOnBackStackChangedListener(this); // Setup toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar); mToolbar.setVisibility(View.VISIBLE); setSupportActionBar(mToolbar); // Setup drawer toggle mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerlayout); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.menu_open, R.string.menu_close); mDrawerLayout.setDrawerListener(mDrawerToggle); getSupportActionBar().setHomeButtonEnabled(true); mDrawerToggle.syncState(); // Setup initial fragment if (savedInstanceState == null) { mCurrentFragment = DashboardFragment.newInstance(); mFm.beginTransaction().add(CONTAINER_ID, mCurrentFragment).commit(); } } 

También recuerda establecer:

 @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } 

Ahora la magia ocurre en onBackStackChanged (). Estableciendo setDrawerIndicatorEnabled como true para el fragmento de arriba y setDisplayHomeAsUpEnabled como false para ese fragmento. Inverso para los otros. También tuve que llamar a syncState o bien la hamburguesa no volvería a aparecer:

 @Override public void onBackStackChanged() { mDrawerToggle.setDrawerIndicatorEnabled(mFm.getBackStackEntryCount() == 0); getSupportActionBar().setDisplayHomeAsUpEnabled(mFm.getBackStackEntryCount() > 0); mDrawerToggle.syncState(); } 

Lo he logrado utilizando el siguiente diseño: He utilizado ActionBarDrawerToggle v7 Drawer.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.toolbar.Drawer" > <include android:id="@+id/tool1" layout="@layout/toolbar" /> <android.support.v4.widget.DrawerLayout android:id="@+id/drawerLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/tool1" > <FrameLayout android:id="@+id/mainContent" android:layout_width="match_parent" android:layout_height="match_parent" > </FrameLayout> <!-- Nav drawer --> <ListView android:id="@+id/drawerList" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="left" android:background="@android:color/white" android:divider="@android:color/white" android:dividerHeight="8dp" android:drawSelectorOnTop="true" android:headerDividersEnabled="true" /> </android.support.v4.widget.DrawerLayout> </RelativeLayout> 

Toolbar.xml

 <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app1="http://schemas.android.com/apk/res/com.example.toolbar" android:id="@+id/my_awesome_toolbar" android:layout_width="fill_parent" android:layout_height="75dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" app1:popupTheme="@style/ThemeOverlay.AppCompat.Light" app1:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" > </android.support.v7.widget.Toolbar> 

Drawer.java

Package com.example.toolbar;

 import android.content.res.Configuration; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.widget.Toolbar; import android.view.Gravity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; public class Drawer extends ActionBarActivity { ActionBarDrawerToggle mDrawerToggle; private String[] days; ArrayAdapter<String> adapter; private ListView mDrawerList; DrawerLayout mDrawerLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.drawer); days = new String[] { "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" }; adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, days); mDrawerList = (ListView) findViewById(R.id.drawerList); mDrawerList.setAdapter(adapter); mDrawerList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub Fragment fragment = new MyFragment(); Bundle args = new Bundle(); args.putString(MyFragment.ARG_PLANET_NUMBER, days[position]); // args.putInt(MyFragment.ARG_PLANET_NUMBER, position); fragment.setArguments(args); FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.mainContent, fragment).commit(); } }); Toolbar toolbar = (Toolbar) findViewById(R.id.tool1); setSupportActionBar(toolbar); toolbar.setTitle("ToolBar Demo"); toolbar.setLogo(R.drawable.ic_launcher); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.open_navigation_drawer, R.string.close_navigation_drawer) { @Override public void onDrawerSlide(View drawerView, float slideOffset) { // TODO Auto-generated method stub super.onDrawerSlide(drawerView, slideOffset); } /** Called when a drawer has settled in a completely closed state. */ @Override public void onDrawerClosed(View view) { super.onDrawerClosed(view); getSupportActionBar().setTitle("hello"); } /** Called when a drawer has settled in a completely open state. */ @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); getSupportActionBar().setTitle("hi"); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); // getSupportActionBar().setDisplayHomeAsUpEnabled(true); //<---- added // getSupportActionBar().setHomeButtonEnabled(true); //<---- added } @Override public boolean onOptionsItemSelected(MenuItem item) { // <---- added if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); } @Override protected void onPostCreate(Bundle savedInstanceState) { // <---- added super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); // important statetment for drawer to // identify // its state } @Override public void onConfigurationChanged(Configuration newConfig) { // <---- added super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public void onBackPressed() { if (mDrawerLayout.isDrawerOpen(Gravity.START | Gravity.LEFT)) { // <---- // added mDrawerLayout.closeDrawers(); return; } super.onBackPressed(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 

@ Hata respuesta es spot-on para la mayoría de los casos.

Pero en realidad, no se equivocaron al usar la barra de herramientas como argumento para el ActionBarDrawerToggle(...) .

Por supuesto, no tiene sentido hacerlo si está utilizando la Toolbar stock que AppCompatActivity proporciona utilizando, por ejemplo, el tema de archivo Theme.AppCompat.Light . Incluso si desea una Toolbar de Toolbar personalizada en su diseño, por ejemplo, si está implementando el diseño de material de sobre-barra de herramientas bajo la barra de estado del patrón de navegación, todavía puede llamar a setSupportActionBar(toolbar) y aún no pasar la barra de herramientas a ActionBarDrawerToggle() La actividad maneja el icono de navegación.

Pero si realmente quieres vincular tu ActionBarDrawerToggle a una Toolbar que no es barra de acción de la actividad, y tal vez tiene un estilo diferente y un icono diferente o lo que sea – todavía hay un camino por recorrer.

La cosa es, cuando no pasa la barra de herramientas como el cuarto parámetro, se supone que la actividad proporciona el icono de navegación (la flecha) – y AppCompatActivity devuelve el valor del atributo homeAsUpIndicator – está definido en cualquiera de los estándares AppCompat Temas.

Sin embargo, cuando explícitamente pasa la Toolbar , ActionBarDrawerToggle espera que la instancia de la barra de herramientas proporcione el indicador de navegación dibujable, y no, porque incluso si aplica el estilo apropiado a éste de la siguiente manera:

 <android.support.v7.widget.Toolbar ... app:theme="?actionBarTheme" style="@style/Widget.AppCompat.Toolbar"> 

Por alguna razón (tal vez es incluso un error), el estilo Widget.AppCompat.Toolbar no tiene el atributo navigationIcon , por lo que la Toolbar devuelve null cuando ActionBarDrawerToggle le pide el icono de navegación. Por lo tanto, para hacer frente a esto, simplemente se derivan del estilo y añadir el atributo:

 <android.support.v7.widget.Toolbar ... app:theme="?actionBarTheme" style="@style/MyWidget.Toolbar"> <!-- styles.xml --> <style name="MyWidget.Toolbar" parent="Widget.AppCompat.Toolbar"> <item name="navigationIcon">?homeAsUpIndicator</item> </style> 

Ahora puede utilizar el constructor ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, 0, 0) y tener el icono de navegación en su lugar.

Esta línea hace que el icono de la hamburguesa se cambie a flecha al hacer clic. Asegúrese de tener esto escrito en su código.

 mDrawerLayout.setDrawerListener(mDrawerToggle); 
  • No se puede poner DrawerLayout en StatusBar
  • Obteniendo el "puntero" a NavigationBarView.java por reflexión
  • La barra de navegación se vuelve transparente cuando se abre el teclado
  • No se puede importar android.support.design.widget.NavigationView
  • Android: El botón de navegación muestra el lado equivocado cuando la dirección de diseño es RTL
  • ¿Cómo puedo cambiar el color del separador en NavigationView?
  • ¿Hay alguna manera de controlar las vistas dentro del encabezado de NavigationView?
  • NavigationView no está visible pero el clic de artículo está funcionando
  • android - abre el cajón de navegación haciendo clic en el icono de la aplicación?
  • Cómo posicionar elementos de menú en la vista de navegación?
  • Android: Cajón de navegación SubMenu: Cómo elementos de navegación plegables
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.