J'ai un simple Android.support.v7.widget.Toolbar
et tout ce que j'essaie de faire est d'ouvrir un NavigationDrawer en appuyant sur l'icône "hamburger" située dans le coin supérieur gauche. Le bouton "hamburger" est visible, et lorsque je commence à tirer de la gauche, je vois l'animation sur le bouton, mais appuyer sur le bouton ne permet pas d'ouvrir/fermer le NavigationDrawer comme prévu. J'ai suivi la [Google Documentation] [1] et je ne suis toujours pas en mesure de le comprendre. Désolé pour toute confusion, voici 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 c'est le cas, je ne reçois aucune des instructions de débogage de journal lors de l'exécution.
C'est essentiellement le problème que j'ai: https://stackoverflow.com/a/26636045/1489990 . J'ai suivi ça et ça ne marche pas.
Je crois comprendre que setNavigationOnClickListener
est appelé lorsque l’icône hamburger est activée. C’est pourquoi je concentre mes efforts sur la gestion correcte de l’événement. En appuyant sur le bouton, je ne reçois pas mon relevé 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>
Dans votre fichier ActivityMain.xml, la barre d’outils est en dehors de DrawerLayout. C'est le problème. Si vous voulez que Toolbar interagisse avec DrawLayout, Toolbar doit être un enfant de DrawerLayout.
Pour résoudre le problème, faites de DrawerLayout la racine de votre activité. Voici la documentation . La citation pertinente est:
Pour ajouter un tiroir de navigation, déclarez votre interface utilisateur avec un DrawerLayout en tant que vue racine de votre mise en page. À l'intérieur de DrawerLayout, ajoutez une vue contenant le contenu principal du fichier écran (votre mise en page principale lorsque le tiroir est caché) et un autre vue contenant le contenu du tiroir de navigation.
Donc, fondamentalement, structurez votre ActivityMain.xml comme suit:
<Android.support.v4.widget.DrawerLayout ...>
<RelativeLayout ...>
<Android.support.v7.widget.Toolbar .../>
<!-- Your other content goes here -->
</RelativeLayout>
<Android.support.design.widget.NavigationView .../>
</Android.support.v4.widget.DrawerLayout>
Cela devrait régler le problème.
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 post)
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 la nouvelle NavigationView
, alors vous n’avez pas besoin de la bascule, etc. Voici un bon exemple comment l’utiliser.
Remplacez la méthode onOptionsItemSelected
et utilisez ci-dessous
if(item.getItemId() == Android.R.id.home){ // use Android.R.id
mDrawerLayout.openDrawer(Gravity.LEFT);
}
Si cela aide quelqu'un, cela m'est arrivé de la même manière à cause de la stupide erreur d'appeler setSupportActionBar(toolbar)
deux fois. Il suffit de l’appeler une fois dans la méthode onCreate et plus jamais. Mon erreur a été je l'ai appelé plus tard dans une autre méthode.
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);
}
OR
redéfinir onOptionsItemSelected of activity 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 basculer le tiroir, vous devez définir "display home up up" sur false: getSupportActionBar().setDisplayHomeAsUpEnabled(false);
Comme je n'ai pas de réponse spécifique à votre problème, je voudrais suggérer une approche complètement différente:
Dans mes projets, j'utilise le Material Drawer développé par Mike Penz . Son apparence est vraiment agréable, facile à mettre en œuvre et il n’ya pas grand-chose à craindre.
Donc, si vous ne trouvez pas de solution à votre problème, vous pouvez l'essayer.
Utilisez ActionBarDrawerToggle
et implémentez public boolean onOptionsItemSelected(MenuItem item)
La barre d'outils NE DOIT PAS être dans DrawerLayout, ce n'est probablement pas la cause de ce problème. toggle.onOptionsItemSelected(item)
recherche l'ID de l'élément sélectionné et, s'il s'agit de Android.R.id.home
, la visibilité du tiroir est basculée. Ainsi, la barre d’outils ou toute vue créant un élément de menu principal peut être placée n’importe où dans votre mise en page.
Au sein de 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);
}
Alors que la réponse acceptée ici fonctionne bien cependant, comme ils le disent "mieux vaut prévenir que guérir" .. Ajout de mDrawerToggle.syncState (); dans onPostCreate et onConfigurationChanged () fonctionne 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);
}