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.