tab studio medium example android android-layout android-support-library android-navigation

studio - navigation tab android



Appcompatv7-v21 Cajón de navegación que no muestra el ícono de hamburguesas (13)

Estoy implementando el cajón de navegación estilo lollipop con la última biblioteca de soporte de appcompat pero el problema es que el ícono de hamburguesa nunca se muestra. Solo se muestra el ícono de retroceso.

Este es mi código de actividad

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, solo se muestra la flecha hacia atrás, he leído muchas publicaciones pero nada parece marcar la diferencia. Cualquier ayuda sería apreciada.


Al incluir ActionBarDrawerToggle, asegúrese de utilizar el método de publicación:

mDrawerLayout.post(new Runnable() { @Override public void run() { mDrawerToggle.syncState(); } });


Al usar ActionBarDrawerToggle, debe llamarlo 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úrate de llamar

mDrawerToggle.syncState();

DESPUÉS de llamar

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


Asegúrese de importar el alternador de cajón correcto.

Cuando importé la versión v4 tuve la flecha (abajo).

import android.support.v4.app.ActionBarDrawerToggle;

Cambiarlo a esto (abajo, v7) solucionó mi problema.

import android.support.v7.app.ActionBarDrawerToggle;


Como mi NavigationDrawer estaba extendiendo un Fragmento, no una Actividad, no pude anular la PostCreate. Lo siguiente 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!


El panel de navegación no se muestra al hacer clic en el menú de la barra de acciones. 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(); } };


No te olvides de anular el método OpsItemSelected y comprobar si se hizo clic en ctionBarDrawerToggle, en este caso devuelve verdadero; de lo contrario, la actividad habrá finalizado.

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


Simplemente puede usar 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); } });


También tuve un problema similar, en mi caso el problema era que al iniciar actionbartoggle, no estaba pasando un argumento válido de la barra de herramientas (la barra de herramientas se inicializó más tarde), sin una barra de herramientas adecuada, no nula, ActionBarToggle no creará un ícono de hamburguesa.

actionBarToggle = ActionBarDrawerToggle(this, mDrawer, toolbar, R.string.drawer_open, R.string.drawer_close);


Tienes que llamar

mDrawerToggle.syncState();


puede llamar a syncState () desde ActivityPostCreate de su actividad para sincronizar el indicador con el estado de DrawerLayout vinculado después de que onRestoreInstanceState se haya producido.

@Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. mDrawerToggle.syncState(); }

También ActionBarDrawerToggle se puede usar directamente como DrawerLayout.DrawerListener, o si ya está proporcionando su propio oyente, llame a cada uno de los métodos de escucha de su cuenta.

private ActionBarDrawerToggle mDrawerToggle; private DrawerLayout mDrawerLayout; . . . . mDrawerLayout.setDrawerListener(mDrawerToggle); mDrawerLayout.post(new Runnable() { @Override public void run() { mDrawerToggle.syncState(); } });


mDrawerToggle.syncState() no funcionó para mí, pero finalmente conseguí que funcionara con:

getSupportActionBar().setHomeAsUpIndicator(R.drawable.hamburger_icon);

Sin embargo, no estaba usando una barra de herramientas.