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?
- No se puede resolver el símbolo 'NavigationView'
- NavigationView selecciona el elemento seleccionado como
- Debe pasar en una vista no nula
- Tamaño del artículo de menú personalizado y tamaño de texto en la vista de navegación
- Android Cambiar vista de navegación Menú de fondo
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(); }
- Cómo crear un subnivel en el menú de navegación en android?
- Nueva Navegación Cajón - cómo utilizar títulos y contadores?
- Menús dinámicos en NavigationView
- Implementación de un mapa interior
- Cómo crear un ActionBar personalizado con el cajón de navegación
- ¿Por qué aparece la barra de navegación en las aplicaciones de pantalla completa cuando se hace clic en el menú emergente?
- ¿Es posible iniciar la aplicación de navegación desde la página web en Android?
- Barra de navegación de Android superpuesta a mi vista
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);
- ¿Cómo se obtiene el "Nombre de dispositivo" definido por el usuario en android?
- ¿Cómo puedo ejecutar algo sólo una vez por inicio de aplicación?