web-dev-qa-db-fra.com

Cliquer sur l'icône hamburger de la barre d'outils pour ne pas ouvrir le tiroir de navigation

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>

30
ez4nick

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.

88
hungryghost

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.

8
mbmc

Remplacez la méthode onOptionsItemSelected et utilisez ci-dessous

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

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.

1
Benjamin Heinke

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);
    }
}
1
sujith s

Pour basculer le tiroir, vous devez définir "display home up up" sur false: getSupportActionBar().setDisplayHomeAsUpEnabled(false);

1
queencodemonkey

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.

1
W3hri

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);
}
1
Will Vanderhoef

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);
}
0
Vinay