Cliquer sur l'icône du hamburger sur la barre d'outils n'ouvre pas le tiroir de navigation

J'ai un simple android.support.v7.widget.Toolbar et tout ce que j'essaye de faire, c'est d'ouvrir un NavigationDrawer en appuyant sur l'icône "hamburger" dans le coin supérieur gauche. Le bouton "hamburger" est visible, et lorsque je commence à tirer de gauche, je vois l'animation sur le bouton, mais en appuyant sur le bouton, je n'ouvre pas ou ne ferme pas le baliseur de navigation comme prévu. J'ai suivi la [Google Documentation] [1] et je ne suis toujours pas en mesure de comprendre cela. Désolé pour toute confusion, ci-dessous est le code simplifié que je tente actuellement d'utiliser:

 public class MainActivity extends AppCompatActivity implements View.OnClickListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("NICK", "button button button.................."); } }); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer); NavigationView n = (NavigationView) findViewById(R.id.nav); mDrawerLayout.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Log.d("NICK", "button button button.................."); } }); //mDrawerLayout.setDrawerListener(mDrawerToggle); n.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { switch (menuItem.getItemId()) { ////....... } mDrawerLayout.closeDrawers(); // CLOSE DRAWER return true; } }); @Override public boolean onOptionsItemSelected(MenuItem item) { Log.d("NICK","CWECNEWKVNERIPNVIEWNFVIPEWNVIPEWNVPIEWNVPIEWNVPIEWNVPIRWNVPRWVPO"); switch (item.getItemId()) { case android.R.id.home: mDrawerLayout.openDrawer(GravityCompat.START); // OPEN DRAWER Log.d("NICK","CWECNEWKVNERIPNVIEWNFVIPEWNVIPEWNVPIEWNVPIEWNVPIEWNVPIRWNVPRWVPO"); return true; } return super.onOptionsItemSelected(item); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.drawer, menu); return true; } } 

}

Et comme je l'ai, je n'obtiens aucune des instructions de débogage du journal lors de l'exécution.

C'est essentiellement le problème que j'ai: https://stackoverflow.com/a/26636045/1489990 . J'ai suivi cela et ça ne fonctionne pas.

Je comprends que setNavigationOnClickListener est appelé lorsque l'icône de l'hamburger est pressée, et c'est là que je concentre mes efforts est de faire en sorte que l'événement soit correctement traité car lorsque je presse le bouton, je ne reçois pas mon compte de journal. Faites-moi savoir si cette idée est incorrecte. Https://developer.android.com/reference/android/widget/Toolbar.html#setNavigationOnClickListener(android.view.View.OnClickListener)

Mes mises en page:

ActivityMain.xml

 <RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/d" android:background="@drawable/home_wall"> <android.support.v7.widget.Toolbar android:id="@+id/my_toolbar" android:layout_height="wrap_content" android:layout_width="match_parent" android:minHeight="?attr/actionBarSize" android:background="?attr/colorPrimary" android:layout_marginBottom="10dp" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:layout_marginTop="25dp" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" /> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:id="@+id/drawer" android:layout_height="match_parent" android:fitsSystemWindows="true"> <ImageView android:layout_width="fill_parent" android:layout_height="200dp" android:id="@+id/imageView" android:src="@drawable/trans2" android:layout_alignParentTop="true" android:layout_marginTop="10dp" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:paddingBottom="300dp" /> <RelativeLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/d8" android:layout_alignParentTop="true" android:layout_alignLeft="@+id/imageView" android:layout_alignStart="@+id/imageView" android:paddingTop="0dp"> <Button android:layout_width="75dp" android:layout_height="50dp" android:text="Gallery" android:id="@+id/save_button" android:background="#dd2c00" android:textColor="#fff" android:layout_below="@+id/Purchases" android:layout_toRightOf="@+id/start_button" android:layout_toEndOf="@+id/start_button" /> <Button android:layout_width="125dp" android:layout_height="50dp" android:text="Store" android:id="@+id/Purchases" android:background="#ff6e40" android:textColor="#fff" android:layout_above="@+id/instructions_button6" android:layout_toLeftOf="@+id/start_button" android:layout_toStartOf="@+id/start_button" android:layout_marginBottom="98dp" /> <Button android:layout_width="75dp" android:layout_height="50dp" android:text="Help" android:id="@+id/instructions_button6" android:background="#dd2c00" android:textColor="#fff" android:layout_alignParentBottom="true" android:layout_toLeftOf="@+id/start_button" android:layout_toStartOf="@+id/start_button" android:layout_marginLeft="5dp" android:layout_marginBottom="10dp" /> <Button android:layout_width="75dp" android:layout_height="300dp" android:text="Start" android:id="@+id/start_button" android:background="#ff3d00" android:textColor="#fff" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="10dp" /> <Button android:layout_width="125dp" android:layout_height="50dp" android:text="Achievements" android:id="@+id/Scores" android:background="#ff6e40" android:textColor="#fff" android:layout_alignTop="@+id/Purchases" android:layout_toRightOf="@+id/start_button" android:layout_toEndOf="@+id/start_button" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Welcome to the quiz!" android:id="@+id/textView" android:textColor="#fff" android:textSize="20dp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="70dp" /> <!-- sign-in button --> <com.google.android.gms.common.SignInButton android:id="@+id/sign_in_button" android:layout_width="110dp" android:layout_height="50dp" android:layout_above="@+id/start_button" android:layout_centerHorizontal="true" android:visibility="visible" /> <!-- sign-out button --> <Button android:id="@+id/sign_out_button" android:layout_width="125dp" android:layout_height="wrap_content" android:text="Sign Out" android:visibility="invisible" android:background="#dd4b39" android:textColor="#fff" android:layout_alignTop="@+id/sign_in_button" android:layout_centerHorizontal="true" android:layout_marginTop="160dp" /> </RelativeLayout> <android.support.design.widget.NavigationView android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:background="#fff" android:id="@+id/nav" app:headerLayout="@layout/drawer_header" app:menu="@menu/drawer"/> </android.support.v4.widget.DrawerLayout> 

Drawer.xml :

 <menu xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_menu" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:title="Google Play Games" android:icon="@drawable/ic_local_airport_white_48dp"> <menu> <item android:id="@+id/Sign_in_drawer" android:icon="@drawable/games_controller_grey" android:title="Sign in" /> <item android:id="@+id/ach" android:icon="@drawable/games_achievements" android:title="Achievements" /> </menu> </item> <item android:title="Start a Quiz" android:icon="@drawable/ic_local_airport_white_48dp"> <menu> <item android:id="@+id/quizStart25" android:icon="@drawable/ic_local_airport_white_48dp" android:title="25 Questions" /> <item android:id="@+id/quizStart10" android:icon="@drawable/ic_local_airport_white_48dp" android:title="10 Questions" /> </menu> </item> <group android:checkableBehavior="single"> <item android:id="@+id/gallery" android:icon="@drawable/ic_photo_library_white_48dp" android:title="Gallery" /> <item android:id="@+id/stats" android:icon="@drawable/ic_toc_white_48dp" android:title="Statistics" /> <item android:id="@+id/store" android:icon="@drawable/ic_shop_white_48dp" android:title="Store" /> <item android:id="@+id/settings" android:icon="@drawable/ic_settings_white_48dp" android:title="Settings" /> <item android:id="@+id/about" android:icon="@drawable/ic_info_white_48dp" android:title="About" /> </group> <item android:title="Support"> <menu> <item android:id="@+id/help_drawer" android:icon="@drawable/ic_help_white_48dp" android:title="Help" /> <item android:id="@+id/report" android:icon="@drawable/ic_report_problem_white_48dp" android:title="Contact Developer" /> <item android:id="@+id/GPlusCommunity" android:icon="@drawable/btn_g_white_normal" android:title="Google+ Community" /> </menu> </item> 

8 Solutions collect form web for “Cliquer sur l'icône du hamburger sur la barre d'outils n'ouvre pas le tiroir de navigation”

Voir ma réponse à une publication similaire.

Fondamentalement, sautez simplement ActionBarDrawerToggle si vous n'en avez pas besoin pour d'autres choses (comme les rappels). Vous pouvez supprimer tout ce code et simplement mettre en œuvre votre comportement de tiroir ouvert / fermé, comme ceci:

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: mDrawerLayout.openDrawer(GravityCompat.START); // OPEN DRAWER return true; .... } return super.onOptionsItemSelected(item); } 

Le segment de code ci-dessus fonctionne si vous utilisez ou non NavigationView . Si vous utilisez la vue de navigation, dans votre écouteur de clic NavigationView:

 navigationView.setNavigationItemSelectedListener( new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { // Handle menu item clicks here. drawerLayout.closeDrawers(); // CLOSE DRAWER return true; } }); 

Mettre à jour:

Assurez-vous également que votre activité étend l' AppCompatActivity (et non ActionBarActivity ). Voir ma réponse ici pour plus d'informations.

Mise à jour2:

J'ai débogué ton code révisé. Essaye ça. Cela devrait fonctionner maintenant. Lisez mes commentaires en ligne pour voir ce que j'ai changé et pourquoi:

 import android.os.Bundle; import android.support.design.widget.NavigationView; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends AppCompatActivity { // View.OnClickListener, // GoogleApiClient.ConnectionCallbacks, // GoogleApiClient.OnConnectionFailedListener { DrawerLayout mDrawerLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar); setSupportActionBar(toolbar); // You were missing this setHomeAsUpIndicator getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu); getSupportActionBar().setDisplayHomeAsUpEnabled(true); // I removed your toolbar and drawer click listeners. // They're not needed to open drawer. // The drawer opens from onOptionsItemSelected(). mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer); NavigationView n = (NavigationView) findViewById(R.id.nav); n.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { switch (menuItem.getItemId()) { ////....... } mDrawerLayout.closeDrawers(); // CLOSE DRAWER return true; } }); } @Override public boolean onOptionsItemSelected(MenuItem item) { Log.d("NICK", "CWECNEWKVNERIPNVIEWNFVIPEWNVIPEWNVPIEWNVPIEWNVPIEWNVPIRWNVPRWVPO"); switch (item.getItemId()) { // THIS IS YOUR DRAWER/HAMBURGER BUTTON case android.R.id.home: mDrawerLayout.openDrawer(GravityCompat.START); // OPEN DRAWER Log.d("NICK", "CWECNEWKVNERIPNVIEWNFVIPEWNVIPEWNVPIEWNVPIEWNVPIEWNVPIRWNVPRWVPO"); return true; } return super.onOptionsItemSelected(item); } } // I also removed your onConfigurationChanged(). // It's not needed since you're no longer using ActionBarDrawerToggle. 

Update3: LE PROBLÈME EST AVEC LA DISPOSITION

En regardant votre ActivityMain.xml, je vois que votre barre d'outils est en dehors de votre DrawerLayout. Vous ne pouvez pas faire cela. La barre d'outils doit être un enfant de votre DrawerLayout afin que la barre d'outils trouve son contexte approprié.

Vous devez faire de DrawerLayout la racine de votre activité. Voici la documentation , et le devis spécifique est:

Pour ajouter un tiroir de navigation, déclarez votre interface utilisateur avec un objet DrawerLayout en tant que vue racine de votre mise en page. À l'intérieur de DrawerLayout, ajoutez une vue contenant le contenu principal de l'écran (votre disposition principale lorsque le tiroir est masqué) et une autre vue contenant le contenu du tiroir de navigation.

Donc, modifiez votre ActivityMain.xml pour ressembler à ceci:

 <android.support.v4.widget.DrawerLayout android:id="@+id/drawer" ... > <RelativeLayout android:id="@+id/d" ...> <android.support.v7.widget.Toolbar android:id="@+id/my_toolbar" ... /> <!-- Your other content goes here --> </RelativeLayout> <android.support.design.widget.NavigationView android:id="@+id/nav" ... /> </android.support.v4.widget.DrawerLayout> 

J'espère que cela prend soin de vos problèmes.

Vous devez synchroniser la bascule du tiroir:

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

EDIT: Ce code fonctionne pour moi (copié de votre message)

 public class TempActivity extends AppCompatActivity { private ActionBarDrawerToggle mDrawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.temp); setupDrawer(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onOptionsItemSelected(final MenuItem item) { if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); } private void setupDrawer() { Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.my_drawer_layout); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,toolbar,R.string.drawer_open, R.string.drawer_close) { public void onDrawerClosed(View view) { super.onDrawerClosed(view); invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } }; mDrawerLayout.setDrawerListener(mDrawerToggle); } } <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/my_drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/my_toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> <RelativeLayout android:id="@+id/left_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" android:background="#111"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#FFF" android:text="DRAMER MENU" /> </RelativeLayout> </android.support.v4.widget.DrawerLayout> 

Mais si vous utilisez le nouveau NavigationView , vous n'avez pas besoin de basculer, etc. Voici un bon exemple de l'utilisation.

Comme je n'ai aucune réponse spécifique à votre problème, je souhaite proposer une approche complètement différente:

Dans mes projets, j'utilise le tiroir Matériel développé par Mike Penz. Son aspect très agréable, est facile à mettre en œuvre, et il n'y a pas grand-chose dont vous devez vous soucier.

Donc, si vous ne trouvez pas une solution pour votre problème, vous pouvez essayer.

Remplacer la méthode OnOptionsItemSelected et l'utiliser ci-dessous

 if(item.getItemId() == android.R.id.home){ // use android.R.id mDrawerLayout.openDrawer(Gravity.LEFT); } 

Utilisez ActionBarDrawerToggle et public boolean onOptionsItemSelected(MenuItem item)

La barre d'outils NE DOIT PAS être dans un DrawerLayout, il n'est pas susceptible de causer ce problème. toggle.onOptionsItemSelected(item) recherche l'ID de l'élément sélectionné et s'il s'agit de la fonctionnalité android.R.id.home la visibilité du tiroir est basée. Ainsi, la barre d'outils, ou toute vue qui crée un Home MenuItem, peut être placée n'importe où dans votre mise en page.

Dans votre activité:

 ActionBarDrawerToggle toggle; private void setupDrawerToggleInActionBar() { // assuming a Toolbar has been initialized in your onCreate this.setSupportActionBar(toolbar); // setup the action bar properties that give us a hamburger menu ActionBar actionBar = this.getSupportActionBar(); if(actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); } // the toggle allows for the simplest of open/close handling toggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.navigation_drawer_open, R.string.navigation_drawer_close); // drawerListener must be set before syncState is called drawerLayout.setDrawerListener(toggle); toggle.setDrawerIndicatorEnabled(true); toggle.syncState(); } @Override public boolean onOptionsItemSelected(MenuItem item) { // This is required to make the drawer toggle work if(toggle.onOptionsItemSelected(item)) { return true; } /* * if you have other menu items in your activity/toolbar * handle them here and return true */ return super.onOptionsItemSelected(item); } 

Appelez simplement la fonction onOptionsItemSelected (MenuItem menuItem) de la classe ActionBarDrawerToggle sur la fonction de gestion du menu des options d'activité comme ci-dessous.

 mDrawerToggle= new ActionBarDrawerToggle(activity, drawerLayout, R.string.nav_drawer_accessbility_drawer_open, R.string.nav_drawer_accessbility_drawer_close); @Override public boolean onOptionsItemSelected(final android.view.MenuItem item) { navigation().getOptionsMenuInflater(this).closeSearchView(); // The action bar home/up action should open or close the drawer. // ActionBarDrawerToggle will take care of this behavior. mDrawerToggle.onOptionsItemSelected(item); return super.onOptionsItemSelected(item); } 

OU

Annuler onOptionsItemSelection de l'activité comme ci-dessous

 public boolean onOptionsItemSelected(MenuItem item) { if (item != null && item.getItemId() == android.R.id.home) { toggle(); } return super.onOptionsItemSelected(item); } private void toggle() { if (mDrawerLayout.isDrawerVisible(GravityCompat.START)) { mDrawerLayout.closeDrawer(GravityCompat.START); } else { mDrawerLayout.openDrawer(GravityCompat.START); } } 

Pour le basculement du tiroir, vous devez configurer "afficher la maison en haut" sur false: getSupportActionBar().setDisplayHomeAsUpEnabled(false);

Bien que la réponse acceptée fonctionne bien, mais comme ils disent "La prévention est meilleure que la guérison". Ajouter mDrawerToggle.syncState (); In onPostCreate et onConfigurationChanged () wroks beaucoup mieux comme réponse par @mbmc ci-dessus:

 @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); mDrawerToggle.onConfigurationChanged(newConfig); } 
coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.