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

96

Je veux utiliser à la ToolBarplace de ActionBar, mais ne me montre pas le menu dans la barre d'outils !!! Je veux un menu de réglage tel que les boutons Actualiser ou Paramètres dans ActionBar.

entrez la description de l'image ici

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

Code MainPage.java:

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

code 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/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 mes chers <3

Dr NoBody
la source
4
Vous pouvez vérifier ici: stackoverflow.com/questions/31231609/…
Chol
2
C'est ce qui me manquait toolbar.inflateMenu (R.menu.main_manu);
skryshtafovych
Essayez de créer une nouvelle application en utilisant Android Studioet vérifiez-la. «ToolBar» ne doit pas être une entité indépendante.
Abhinav Saxena

Réponses:

154

remplacez 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;
}
Keyur
la source
66

N'utilisez pas setSupportActionBar (barre d'outils)

Je ne sais pas pourquoi mais cela fonctionne 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 faire ceci

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

Mettra à jour la partie «pourquoi» de cette réponse lorsque je trouverai une explication appropriée.
Heureux d'aider quand même :) Paix.

Rohit Singh
la source
5
Votre réponse m'alarme, mais cela n'explique pas pourquoi je ne devrais pas l'utiliser.
Richard Rout
5
Vous devez expliquer pourquoi ne pas utiliser setSupportActionBar (barre d'outils) au lieu de simplement dire ce qui fonctionne pour vous.
Vinicius Victor
1
C'est la seule chose qui a fonctionné pour moi. J'utilise Xamarin.Android avec une barre d'outils personnalisée.
Washington A. Ramos
1
Je vais en lire plus et mettre à jour la réponse @AbhinavSaxena. Bon appel
Rohit Singh
Veuillez également publier le fichier main_activity_layout.xml. Cela fonctionne et est une solution exceptionnelle, mais vous devez compléter la réponse. Reste que j'ai fait dans ma réponse.
Abhinav Saxena le
51

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

entrez la description de l'image ici

1.Faites un menu xml

Cela va être dedans res/menu/main_menu.

  • Cliquez avec le bouton droit sur le resdossier et choisissez Nouveau> Fichier de ressources Android .
  • Saisissez main_menule 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 resavec le bouton droit de la souris et choisir Nouvel élément d'image pour créer l' ic_addicône.

2. Gonflez le menu

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

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

3. Gérer les clics de menu

Toujours 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

Suragch
la source
4
Merci d'avoir montré tous les composants nécessaires ensemble, au lieu de seulement deux lignes de code.
Big_Chair
44

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 définissez votre barre d'outils comme ceci:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Parth Anjaria
la source
7

Vous en avez également besoin pour implémenter une action dans 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;
}
Liliana J
la source
3

Bien que je sois d'accord avec cette réponse, car il a moins de lignes de code et que cela fonctionne:

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

Ma suggestion serait de toujours démarrer un projet à l'aide de 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 themedéclaré dans styles.xml, qui est appliqué à Main Activitydans le AndroidManifest.xml, il n'y a pas d'exceptions, vous devez donc le vérifier ici.

<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. Le Toolbarn'est pas une entité indépendante, c'est toujours une vue enfant dans la mesure AppBarLayoutoù il est encore l'enfant de CoordinatorLayout.
  2. Le code de création d'un menu est le code standard depuis le premier jour, qui se répète encore et encore dans toutes les réponses, en particulier celle 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 sous Android

MARCHERA.

Codage heureux :-)

Abhinav Saxena
la source
2

Dans votre activité, remplacez cette méthode.

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

Cela gonflera 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>
Khemraj
la source
1

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 XML du menu vers l'id de la barre d'outils. J'espère que cela pourra 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>
Natan Rincker
la source
0

Solution simple à ce se couchait showAsActionà alwaysdans menu.xmldans 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>
Windula Kularatne
la source
0
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar;        
    toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
  }



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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_drawer){
           drawerLayout.openDrawer(GravityCompat.END);
            if (drawerLayout.isDrawerOpen(GravityCompat.END)) {
                drawerLayout.closeDrawer(GravityCompat.END);
            } else {
                drawerLayout.openDrawer(GravityCompat.END);
            }
        }
        return super.onOptionsItemSelected(item);
    }

res / layout / tiroir_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/action_drawer"
        android:title="@string/app_name"
        android:icon="@drawable/ic_menu_black_24dp"
        app:showAsAction="always"/>

</menu>

toolbar.xml

<com.google.android.material.appbar.AppBarLayout
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:theme="@style/AppTheme.AppBarOverlay">

<androidx.appcompat.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"
    app:titleTextColor="@android:color/white"
    app:titleTextAppearance="@style/TextAppearance.Widget.Event.Toolbar.Title">

     <TextView
         android:id="@+id/toolbar_title"
         android:layout_gravity="center"
         android:layout_height="wrap_content"
         android:layout_width="wrap_content"
         android:text="@string/app_name"
         android:textColor="@android:color/white"
         style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" />

</androidx.appcompat.widget.Toolbar>

Meysam Keshvari
la source
0
private Toolbar toolbar;

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

    toolbar = (Toolbar) findViewById(R.id.my_toolbar);
    *// here is where you set it to show on the toolbar*
    setSupportActionBar(toolbar);
}

Eh bien, vous devez définir la barre d'action de support setSupportActionBar (); et passez votre variable, comme ceci:setSupportActionBar(toolbar);

Kalaiyo5
la source
0

En XML, ajoutez une ligne à l'intérieur <Toolbar/>

<com.google.android.material.appbar.MaterialToolbar
app:menu="@menu/main_menu"/>

Dans le fichier java, remplacez ceci:

 setSupportActionBar(toolbar);
        if (getSupportActionBar() != null) {
            getSupportActionBar().setTitle("Main Page");
        }

avec ça:

toolbar.setTitle("Main Page")
bhanwar
la source
0

Vous pouvez toujours utiliser la réponse fournie en utilisant Toolbar.inflateMenu même en utilisant setSupportActionBar (barre d'outils).

J'ai eu un scénario où je devais déplacer la fonctionnalité de configuration de la barre d'outils dans une classe distincte en dehors de l'activité qui ne connaissait pas à elle seule l'événement onCreateOptionsMenu.

Donc, pour implémenter cela, tout ce que j'avais à faire était d'attendre que la barre d'outils soit dessinée avant d'appeler inflateMenu en procédant comme suit:

toolbar.post {
    toolbar.inflateMenu(R.menu.my_menu)
}

Peut-être pas considéré comme très propre mais fait quand même le travail.

Mohib Irshad
la source