web-dev-qa-db-fra.com

Comment ajouter un menu de débordement à la barre d'outils?

J'essaie d'utiliser Android ActionBar dans mon application et j'ai une option cachée dans le menu de débordement.

Il y a beaucoup de documentation, mais c'est déroutant car la plupart d'entre elles ne concernent que les très anciennes versions d'Android, et lorsque vous essayez d'appliquer les mêmes concepts, ils ne fonctionnent plus ou fonctionnent différemment.

C'est dans ma mise en page Activity

<Android.support.v7.widget.Toolbar
    Android:id="@+id/my_toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="?attr/actionBarSize"
    Android:titleTextColor="@Android:color/white"
    Android:background="@color/colorPrimary"
    Android:elevation="4dp"
    Android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

Et ceci est dans la méthode onCreate() de mon Activity

// sets up activity toolbar
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);

myToolbar.showOverflowMenu();
myToolbar.setTitleTextColor(R.color.lightPrimaryText);

J'ai également essayé de gonfler un fichier xml de menu à partir de la onCreateOptionsMenu(), mais cela ne m'a pas non plus donné les résultats que je voulais.

22
JCLaHoot

Définissez un Menu pour votre Toolbar dans le dossier de ressources res/menu , par exemple:

toolbar_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    tools:context=".activity.MainActivity">

    <item
        Android:id="@+id/action_sign_out"
        Android:title="@string/toolbar_sign_out"
        app:showAsAction="never"/>
</menu>

La définition de app:showAsAction="never" Garantit que ce MenuItem ne sera pas affiché dans le Toolbar, mais placé dans le menu de débordement à la place.

Le thème de votre Activity doit être (ou dériver de) l'un des thèmes NoActionBar (Theme.AppCompat.NoActionBar Par exemple, ou Theme.MaterialComponents.NoActionBar Si vous utilisez - Composants matériels ).

Dans votre Activity, configurez votre Toolbar:

Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);

Et surchargez onCreateOptionsMenu() pour gonfler votre ressource de menu précédemment définie:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.toolbar_menu, menu);
    return true;
}

Vous pouvez remplacer onOptionsItemSelected() pour définir le comportement onClick de vos MenuItem (s):

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_sign_out: {
            // do your sign-out stuff
            break;
        }
        // case blocks for other MenuItems (if any)
    }
    return true;
}
45
earthw0rmjim

dans le fichier manifeste déclarer

Android:theme="@style/AppTheme.NoActionBar"

comme ça :

<activity
    Android:name=".ActivityName"
    Android:label="@string/label"
    Android:theme="@style/AppTheme.NoActionBar" />

et ajoutez ceci à votre style:

 <style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

et appelez cela dans Activity onCreate ():

toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

remplacer cette méthode dans l'activité:

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.product_list, menu);
    //U can find item set icon and stuff...
    MenuItem item= menu.findItem(R.id.action_search);

    return true;
}

et déclarez votre menu comme ceci pour le menu de débordement:

  <?xml version="1.0" encoding="utf-8"?>
<menu >
    <group>
        <item
            Android:id="@+id/sign_out"
            Android:title="@string/sign_out" />
        <item
            Android:id="@+id/about"
            Android:title="@string/about" />
    </group>
</menu>

et pour la sélection de l'élément de poignée, appelez cela

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) { 
       case R.id.sign_out:
       //do stuff
           break;
           }  
        return super.onOptionsItemSelected(item);
    }

terminé :)

2
f4rz4m1995