web-dev-qa-db-fra.com

Appcompat V7 - Le tiroir de navigation v21 ne montre pas l'icône de hamburger

J'implémente le tiroir de navigation de style Lollipop avec la dernière bibliothèque de support appcompat, mais le problème est que l'icône hamburger n'est jamais affichée. Seule l'icône de retour est affichée.

Ceci est mon code d'activité

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

 }
}

Ceci est mon fichier de styles

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

Le fichier de mise en page 

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

 Navigation Drawer Showing Back Button

 Navigation Drawer Showing Back Button

Dans les deux cas, seule la flèche arrière est affichée. J'ai lu de nombreux articles mais rien ne semble faire la différence. Toute aide serait appréciée.

90
Ravi

Vous devez appeler

mDrawerToggle.syncState();
139
Pedro Oliveira

Assurez-vous que vous importez le sélecteur de tiroir approprié. 

Lorsque j'ai importé la version v4, j'avais la flèche (ci-dessous). 

import Android.support.v4.app.ActionBarDrawerToggle;

Le changer pour ceci (ci-dessous, v7) corrige mon problème. 

import Android.support.v7.app.ActionBarDrawerToggle;
19
Donn Felker

Lorsque vous utilisez ActionBarDrawerToggle, vous devez l’appeler pendant onPostCreate () et 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);
    }
12
Sathesh

Puisque mon NavigationDrawer était en train d’étendre un fragment et non une activité, je n’ai pas pu remplacer postCreate. Le dessous est ce que j'ai fait.

   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

J'espère que ça aide!

7
user2132226

N'oubliez pas de remplacer la méthode onOptionsItemSelected et de vérifier si ctionBarDrawerToggle a été cliqué, dans ce cas, renvoyez la valeur true sinon l'activité sera terminée.

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

Vous pouvez simplement utiliser ceci:

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

mDrawerToggle.syncState() n'a pas fonctionné pour moi, mais j'ai fini par le faire fonctionner avec:

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

Cependant, je n'utilisais pas de barre d'outils.

3
John Leehey

Lorsque vous incluez ActionBarDrawerToggle, veillez à utiliser la méthode post:

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

vous pouvez appeler syncState () à partir de onPostCreate de votre activité pour synchroniser l'indicateur avec l'état du DrawerLayout lié après que onRestoreInstanceState s'est produit.

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

ActionBarDrawerToggle peut également être utilisé directement en tant que DrawerLayout.DrawerListener ou, si vous fournissez déjà votre propre écouteur, appelez chacune des méthodes d'écoute à partir de la vôtre.

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

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

J'ai également eu un problème similaire, dans mon cas, le problème était Lors du lancement de actionbartoggle, Je ne transmettais pas un argument de barre d'outils valide (la barre d'outils était initialisée ultérieurement). échouer pour créer une icône de hamburger.

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

Le tiroir de navigation ne s'affiche pas lorsque vous cliquez sur le menu de la barre d'actions. Cela a résolu le problème pour moi.

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


        return super.onOptionsItemSelected(item);
    }
0
Ronny Kibet

Cela fonctionne pour moi. J'ai étendu AppCompatActivity au lieu d'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();

    }
};
0
Mahen