web-dev-qa-db-fra.com

Comment définir le menu sur la barre d'outils sous Android

Je veux utiliser ToolBar au lieu de ActionBar, mais ne me montre pas le menu dans la barre d'outils !!! Je veux définir un menu tel que les boutons Refresh ou Setting dans ActionBar.

 enter image description here

Code Toolbar.xml:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar
    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="wrap_content"
    Android:background="?attr/colorPrimary"
    Android:minHeight="?attr/actionBarSize"
    app:navigationContentDescription="@string/abc_action_bar_up_description"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:title="Main Page"
    Android:gravity="center"/>

MainPage.Java code:

public class MainPage extends AppCompatActivity {
    private Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_page);

        toolbar = (Toolbar) findViewById(R.id.main_toolbar);
        setSupportActionBar(toolbar);
        if (getSupportActionBar() != null) {
            getSupportActionBar().setTitle("Main Page");
        }
        toolbar.setSubtitle("Test Subtitle");
        toolbar.inflateMenu(R.menu.main_manu);
    }
}

main_menu.xml code: 

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

    <item
        Android:id="@+id/menu_main_setting"
        Android:icon="@drawable/ic_settings"
        Android:orderInCategory="100"
        app:showAsAction="always"
        Android:actionLayout="@layout/toolbar"
        Android:title="Setting" />

    <item
        Android:id="@+id/menu_main_setting2"
        Android:icon="@drawable/ic_settings"
        Android:orderInCategory="200"
        app:showAsAction="always"
        Android:actionLayout="@layout/toolbar"
        Android:title="Setting" />

</menu>

Comment résoudre ce problème et afficher le menu dans Toolbar? merci à tous <3

51
Dr.NoBody

écrasez simplement onCreateOptionsMenu comme ceci dans votre MainPage.Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return true;
}
94
Keyur Lakhani

Vous devez remplacer ce code dans votre activité:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu, this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main2, menu);
    return true;
}

et configurez votre barre d’outils comme ceci:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
32
Parth Anjaria

N'utilisez pas setSupportActionBar (barre d'outils)

Je ne sais pas pourquoi mais ça marche pour moi. 

toolbar = (Toolbar) findViewById(R.id.main_toolbar);
toolbar.setSubtitle("Test Subtitle");
toolbar.inflateMenu(R.menu.main_manu);

Pour l'élément de menu, cliquez sur le faire 

toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {

        @Override
        public boolean onMenuItemClick(MenuItem item) {

            if(item.getItemId()==R.id.item1)
            {
                // do something
            }
            else if(item.getItemId()== R.id.filter)
            {
               // do something
            }
            else{
               // do something
            }

            return false;
        }
    });

Met à jour la partie 'pourquoi' de cette réponse lorsque je trouve un bonne explication.
Heureux d'aider quand même :) Paix.

26
Rohit Singh

Voici une réponse plus complète en tant que référence pour les futurs visiteurs. J'utilise généralement un barre d'outils de support mais cela fonctionne aussi bien dans les deux cas.

enter image description here

1. Faire un menu xml

Cela va être dans res/menu/main_menu.

  • Cliquez avec le bouton droit sur le dossier res et choisissez Nouveau> Fichier de ressources Android
  • Tapez main_menu pour le nom du fichier.
  • Choisissez Menu pour le type de ressource.

Collez le contenu suivant comme entrée.

<?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">
    <item
        Android:id="@+id/action_add"
        Android:icon="@drawable/ic_add"
        app:showAsAction="ifRoom"
        Android:title="Add">
    </item>
    <item
        Android:id="@+id/action_settings"
        app:showAsAction="never"
        Android:title="Settings">
    </item>
</menu>

Vous pouvez cliquer avec le bouton droit de la souris sur res et choisir Nouvel actif d'image pour créer l'icône ic_add.

2. Gonflez le menu

Dans votre activité, ajoutez la méthode suivante.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    return true;
}

3. Gérer les clics du menu

Également dans votre activité, ajoutez la méthode suivante:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
        case R.id.action_add:
            addSomething();
            return true;
        case R.id.action_settings:
            startSettings();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

Lectures complémentaires

21
Suragch

Bien que je sois d’accord avec cette réponse, elle contient moins de lignes de code et fonctionne:

Comment définir le menu sur la barre d'outils dans Android

Ma suggestion serait de toujours commencer tout projet en utilisant l'Assistant Android Studio. Dans ce code, vous trouverez quelques styles: - 

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

et l'utilisation est:

<Android.support.design.widget.AppBarLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:theme="@style/AppTheme.AppBarOverlay">

<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />

</Android.support.design.widget.AppBarLayout> 

En raison de no action bar theme déclaré dans styles.xml, qui est appliqué au Main Activity dans le AndroidManifest.xml, il n'y a pas d'exception, vous devez donc le vérifier à cet endroit.

<activity Android:name=".MainActivity" Android:screenOrientation="portrait"
        Android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
  1. La Toolbar n'est pas une entité indépendante, c'est toujours un enfant Voir dans AppBarLayout qui est encore l'enfant de CoordinatorLayout.
  2. Le code permettant de créer un menu est le code standard utilisé depuis le premier jour, .__, qui est répété maintes fois dans toutes les réponses, en particulier Celle qui est marquée, mais personne ne s’est rendu compte de la différence.

TOUS LES DEUX:

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

ET:

Comment définir le menu sur la barre d'outils dans Android

MARCHERA.

Bonne codage :-)

1
Abhinav Saxena

Aussi, vous en avez besoin pour mettre en œuvre des actions pour toutes les options du menu.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menu_help:
            Toast.makeText(this, "This is teh option help", Toast.LENGTH_LONG).show();
            break;
        default:
            break;
    }
    return true;
}
1
Liliana J

Dans votre activité, remplacez cette méthode. 

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

Cela va gonfler votre menu ci-dessous:

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

        <item
            Android:id="@+id/menu_main_setting"
            Android:icon="@drawable/ic_settings"
            Android:orderInCategory="100"
            app:showAsAction="always"
            Android:actionLayout="@layout/toolbar"
            Android:title="Setting" />

        <item
            Android:id="@+id/menu_main_setting2"
            Android:icon="@drawable/ic_settings"
            Android:orderInCategory="200"
            app:showAsAction="always"
            Android:actionLayout="@layout/toolbar"
            Android:title="Setting" />

    </menu>
1
Khemraj

Dans mon cas, j'utilise un AppBarLayout avec un CollapsingToolbarLayout et le menu défilait toujours hors de l'écran, j'ai résolu mon problème en basculant Android: actionLayout dans le code XML du menu sur l'ID de la barre d'outils. J'espère que cela peut aider les gens dans la même situation!

activity_main.xml

<Android.support.design.widget.CoordinatorLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:fab="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context=".activities.MainScreenActivity"
    Android:screenOrientation="portrait">

    <Android.support.design.widget.AppBarLayout
        Android:layout_width="match_parent"
        Android:layout_height="300dp"
        app:elevation="0dp"
        Android:theme="@style/AppTheme.AppBarOverlay">
        <Android.support.design.widget.CollapsingToolbarLayout
            Android:id="@+id/collapsingBar"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            app:layout_scrollFlags="exitUntilCollapsed|scroll"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginStart="48dp"
            app:expandedTitleMarginEnd="48dp"
            >
            <Android.support.v7.widget.Toolbar
                Android:id="@+id/toolbar"
                Android:layout_width="match_parent"
                Android:layout_height="?attr/actionBarSize"
                Android:background="?attr/colorPrimary"
                app:elevation="0dp"
                app:popupTheme="@style/AppTheme.PopupOverlay"
                app:layout_collapseMode="pin"/>
        </Android.support.design.widget.CollapsingToolbarLayout>


    </Android.support.design.widget.AppBarLayout>
</Android.support.design.widget.CoordinatorLayout>

main_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">
    <item
        Android:id="@+id/logoutMenu"
        Android:orderInCategory="100"
        Android:title="@string/log_out"
        app:showAsAction="never"
        Android:actionLayout="@id/toolbar"/>
    <item
        Android:id="@+id/sortMenu"
        Android:orderInCategory="100"
        Android:title="@string/sort"
        app:showAsAction="never"/> </menu>
0
Natan Rincker

Une solution simple à ce problème a été de définir showAsAction sur always dans menu.xml dans res/menu

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

    <item
        Android:id="@+id/add_alarm"
        Android:icon="@drawable/ic_action_name"
        Android:orderInCategory="100"
        Android:title="Add"
        app:showAsAction="always"
        Android:visible="true"/>

</menu>
0
LoLcode69