Appcompatv7 – v21 El cajón de navegación no muestra el icono de hamburguesa
Estoy implementando el cajón de navegación de estilo lollipop con la última biblioteca de soporte appcompat, pero el problema es que el icono de hamburguesa nunca se muestra. Sólo se muestra el icono posterior.
Este es mi código de actividad
- Android Support BottomSheetBehavior estado adicional anclado
- Android ViewPager con páginas anteriores y siguientes visibles?
- Cómo usar setImageTintList () en la API de Android <21
- No puede acceder a DialogStyle
- Cómo obtener la barra de herramientas de fragmento?
import android.os.Bundle; 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.View; public class Home extends ActionBarActivity { private DrawerLayout mDrawerLayout; private ActionBarDrawerToggle mDrawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); initViews(); } private void initViews(){ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); toolbar.setTitleTextColor(getResources().getColor(android.R.color.white)); setSupportActionBar(toolbar); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,toolbar , R.string.drawer_open, R.string.drawer_close) { /** Called when a drawer has settled in a completely closed state. */ public void onDrawerClosed(View view) { super.onDrawerClosed(view); //getActionBar().setTitle(mTitle); //invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } /** Called when a drawer has settled in a completely open state. */ public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); //getActionBar().setTitle(mDrawerTitle); //invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } }; // Set the drawer toggle as the DrawerListener mDrawerLayout.setDrawerListener(mDrawerToggle); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); } }
Este es mi archivo de estilos
<resources> <!-- Application theme. --> <style name="Theme.Test" parent="@style/Theme.AppCompat.Light"> <!-- customize the color palette --> <item name="colorPrimary">@color/primary</item> <item name="colorPrimaryDark">@color/primary_dark</item> <item name="colorAccent">@color/accent</item> <item name="windowActionBar">false</item> <item name="drawerArrowStyle">@style/Theme.Test.DrawerArrowStyle</item> </style> <style name="Theme.Test.DrawerArrowStyle" parent="@style/Widget.AppCompat.DrawerArrowToggle"> <item name="spinBars">true</item> <item name="color">@android:color/white</item> </style>
El archivo de diseño
<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" > <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" app:theme="@style/ThemeOverlay.AppCompat.ActionBar" /> <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/toolbar"> <!-- The main content view --> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- The navigation drawer --> <ListView android:id="@+id/left_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="#111" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" /> </android.support.v4.widget.DrawerLayout> </RelativeLayout>
En ambos casos sólo se muestra la flecha hacia atrás, he leído muchos puestos, pero nada parece hacer una diferencia. Cualquier ayuda sería apreciada.
- ViewPager.setOffscreenPageLimit (0) no funciona como se esperaba
- Preferences Support Library - SwitchPreference no funciona
- Android no cambia el tamaño de mi diseño cuando hay un NestedScrollView en la jerarquía
- Paquete android.support.v7.internal.view.menu no existe: no se puede encontrar la clase de símbolo MenuBuilder
- Soporte de transición de fragmentos 25.1.0 con Recyclerview
- Xamarin: No se encontró ningún recurso que coincida con los nombres (AppCompat)
- ¿Es necesario actionbarsherlock ya?
- Diferencia entre una vista de AppCompat y una vista de Android normal
Tienes que llamar
mDrawerToggle.syncState();
Asegúrese de que está importando el conmutador del cajón correcto.
Cuando importé la versión v4 tuve la flecha (abajo).
import android.support.v4.app.ActionBarDrawerToggle;
Cambiarlo a esto (abajo, v7) arregló mi problema.
import android.support.v7.app.ActionBarDrawerToggle;
Cuando se utiliza el ActionBarDrawerToggle, debe llamar durante onPostCreate () y onConfigurationChanged ()
@Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. mDrawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Pass any configuration change to the drawer toggls mDrawerToggle.onConfigurationChanged(newConfig); }
Asegúrese de que llame
mDrawerToggle.syncState();
Después de llamar
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true);
Debido a que mi NavegadorDrawer estaba ampliando un Fragmento no una Actividad, no pude reemplazar postCreate. Lo que sigue es lo que hice.
ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); // this sets the button to the back icon actionBar.setHomeButtonEnabled(true); // makes it clickable actionBar.setHomeAsUpIndicator(R.drawable.ic_drawer);// set your own icon
¡Espero eso ayude!
No olvide anular el método onOptionsItemSelected y comprobar si se ha hecho clic en ctionBarDrawerToggle, en este caso devolver true de lo contrario la actividad se terminará.
@Override public boolean onOptionsItemSelected(MenuItem item) { if (actionBarDrawerToggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); }
mDrawerToggle.syncState()
no funcionó para mí, pero finalmente conseguí que funcionara con:
getSupportActionBar().setHomeAsUpIndicator(R.drawable.hamburger_icon);
Yo, sin embargo, no estaba usando una barra de herramientas.
Usted puede simplemente utilizar esto:
// Defer code dependent on restoration of previous instance state. mDrawerLayout.post(new Runnable() { @Override public void run() { mDrawerToggle.syncState(); getActionBar().setHomeAsUpIndicator(R.drawable.ic_drawer); } });
Incluyendo ActionBarDrawerToggle, asegúrese de usar el método post:
mDrawerLayout.post(new Runnable() { @Override public void run() { mDrawerToggle.syncState(); } });
Puede llamar a syncState () desde OnPostCreate de su actividad para sincronizar el indicador con el estado del DrawerLayout vinculado después de que se haya producido onRestoreInstanceState.
@Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. mDrawerToggle.syncState(); }
También ActionBarDrawerToggle se puede utilizar directamente como DrawerLayout.DrawerListener, o si ya está proporcionando su propio oyente, llame a través de cada uno de los métodos de escucha de su propio.
private ActionBarDrawerToggle mDrawerToggle; private DrawerLayout mDrawerLayout; . . . . mDrawerLayout.setDrawerListener(mDrawerToggle); mDrawerLayout.post(new Runnable() { @Override public void run() { mDrawerToggle.syncState(); } });
El cajón de navegación no se muestra al hacer clic en el menú de la barra de acción. Esto me lo arregló.
@Override public boolean onOptionsItemSelected(MenuItem item) { if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } //add your switch statement return super.onOptionsItemSelected(item); }
Esto funciona para mí. He extendido AppCompatActivity en lugar de ActionBarActivity.
mActionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,null, R.string.drawer_opened, R.string.drawer_closed) { @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); if( getSupportActionBar()!= null) getSupportActionBar().setTitle(R.string.drawer_opened); mActionBarDrawerToggle.syncState(); } @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); if(getSupportActionBar() != null) getSupportActionBar().setTitle(R.string.drawer_closed); mActionBarDrawerToggle.syncState(); } };
También tengo problema similar, en mi caso el problema era, al iniciar actionbartoggle, no estaba pasando el argumento barra de herramientas válida (barra de herramientas se inicializó más tarde), sin una barra de herramientas adecuada, no nula, ActionBarToggle no creará un icono de hamburguesa.
actionBarToggle = ActionBarDrawerToggle(this, mDrawer, toolbar, R.string.drawer_open, R.string.drawer_close);
- ¿Cuál es la sintaxis para escribir comentarios en el archivo build.gradle?
- Cómo eliminar el relleno alrededor de los botones en Android?