Appcompatv7 - v21 Il cassetto di navigazione non mostra l'icona dell'hamburger


101

Sto implementando il cassetto di navigazione in stile lecca-lecca con l'ultima libreria di supporto per appcompat, ma il problema è che l'icona dell'hamburger non viene mai visualizzata. Viene mostrata solo l'icona indietro.

Questo è il mio codice attività

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); 

 }
}

Questo è il mio file di stili

 <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>

Il file di layout

<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>

Cassetto di navigazione che mostra il pulsante Indietro

Cassetto di navigazione che mostra il pulsante Indietro

In entrambi i casi viene mostrata solo la freccia indietro, ho letto molti post ma niente sembra fare la differenza. Qualsiasi aiuto sarebbe apprezzato.

Risposte:


148

Devi chiamare

mDrawerToggle.syncState();

2
Immagino che all'interno di onDrawerClosed () e onDrawerOpened ()
Paul Verest

14
Subito dopo aver inizializzato il tuoActionBarDrawerToggle
Pedro Oliveira

1
Ciao! Possiamo mostrare l'icona Hamburger senza chiamare mDrawerToggl.syncState(), in realtà sto mostrando il cassetto di navigazione come sovrapposizione sulla barra degli strumenti, quindi l'animazione non è richiesta nel mio caso.
Shajeel Afzal

1
Forse il tuo problema è un altro @AlexVPerl. Non c'è bisogno di downvote solo perché non ha funzionato per te. Diavolo, se ho intenzione di sottovalutare tutte le risposte che non funzionano per me ...
Pedro Oliveira

1
@PedroOliveira Non è questo il caso d'uso dei pulsanti di voto su / giù?
AlexVPerl

19

Assicurati di importare l'interruttore del cassetto corretto.

Quando ho importato la versione v4 avevo la freccia (sotto).

import android.support.v4.app.ActionBarDrawerToggle;

Modificandolo in questo (sotto, v7) ha risolto il mio problema.

import android.support.v7.app.ActionBarDrawerToggle;

14

Assicurati di chiamare

mDrawerToggle.syncState();

DOPO la chiamata

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

è possibile senza impostare la barra degli strumenti come barra delle azioni, per mostrare l'hamburger disegnabile?
sviluppatore Android

13

Quando si utilizza ActionBarDrawerToggle, è necessario chiamarlo durante onPostCreate () e 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);
    }

E onOptionsItemSelectedanche.
Brais Gabin

Non aiuta per me. Android 6.0
a_subscriber

9

Poiché il mio NavigationDrawer stava estendendo un Fragment, non un'attività, non sono stato in grado di sovrascrivere postCreate. Di seguito è quello che ho fatto.

   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

Spero che sia d'aiuto!


Forse espandere un po 'il motivo per cui pensi che questo aiuterebbe la persona che lo chiede?
Mikael Ohlson

Siamo spiacenti che volessero visualizzare l'icona dell'hamburger e il modo in cui l'ho modificata era con il codice sopra. Si prega di leggere i commenti accanto al codice. Questo potrebbe aiutare le persone che rimangono bloccate con l'icona indietro nel riquadro di navigazione a scomparsa.
user2132226

Come mostreresti l'hamburger disegnabile nella barra degli strumenti, senza rendere la barra degli strumenti come barra delle azioni?
sviluppatore Android

6

Non dimenticare di sovrascrivere il metodo onOptionsItemSelected e controllare se è stato fatto clic su ctionBarDrawerToggle, in questo caso restituisci true altrimenti l'attività sarà terminata.

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

3
One-liner:return actionBarDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item)
gregschlom

5

Puoi semplicemente usare questo:

// 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);
    }
});

rimuovi il codice dopo mDrawerToggle.syncState () e sei a posto.
Ahmad Jamil Al Rasyid

3

Mentre includi ActionBarDrawerToggle, assicurati di utilizzare il metodo di pubblicazione:

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

Questo ha funzionato per me! Questo e anche la rimozione di una soluzione alternativa eseguita utilizzando setHomeAsUpIndicator(R.drawable.ic_menu/ic_back)quello stava forzando l'icona che veniva simulata durante il passaggio da un frammento all'altro. Ma dopo essere stato aggiornato alla nuova icona animata di hamburger, ciò non funziona.
Jota

3

mDrawerToggle.syncState() non ha funzionato per me, ma alla fine l'ho trovato su cui lavorare:

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

Tuttavia, non stavo utilizzando una barra degli strumenti.


Questa riga di codice mi ha salvato la giornata. Ho convertito il mio codice Eclipse in Android Studio e all'improvviso il mio pulsante di attivazione / disattivazione del cassetto si è convertito automaticamente in freccia. ora funziona correttamente dopo aver aggiunto questa riga di codice. Grazie mille @john Leehey
Hitesh Kamani

3

Ho anche riscontrato un problema simile, nel mio caso il problema era, quando si avviava actionbartoggle, non stavo passando un argomento valido della barra degli strumenti (la barra degli strumenti è stata inizializzata in seguito), senza una barra degli strumenti adeguata e non nulla, ActionBarToggle non riuscirà a creare un'icona hamburger.

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

1

puoi chiamare syncState () da onPostCreate della tua attività per sincronizzare l'indicatore con lo stato del DrawerLayout collegato dopo che si è verificato onRestoreInstanceState.

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

Anche ActionBarDrawerToggle può essere usato direttamente come DrawerLayout.DrawerListener, o se stai già fornendo il tuo listener, chiama attraverso ciascuno dei metodi listener dal tuo.

private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
  .
  .
  .
  .
mDrawerLayout.setDrawerListener(mDrawerToggle);

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

1

Il cassetto di navigazione non veniva visualizzato quando si faceva clic sul menu della barra delle azioni. Questo ha risolto il problema per me.

   @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
      //add your switch statement


        return super.onOptionsItemSelected(item);
    }

1

Questo funziona per me. Ho esteso AppCompatActivity invece di 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();

    }
};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.