Come impostare il menu sulla barra degli strumenti in Android


96

Voglio usare al ToolBarposto di ActionBar, ma non mostrarmi il menu nella barra degli strumenti !!! Voglio impostare menu come Aggiorna o pulsanti di impostazione in ActionBar.

inserisci qui la descrizione dell'immagine

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

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

codice 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>

Come risolvere questo problema e mostrare il menu in Toolbar? grazie a tutti cari <3




2
Questo è quello che mi mancava toolbar.inflateMenu (R.menu.main_manu);
skryshtafovych


Prova a creare una nuova applicazione usando Android Studioe controllala. "ToolBar" non dovrebbe essere un'entità indipendente.
Abhinav Saxena

Risposte:


154

basta sovrascrivere onCreateOptionsMenu in questo modo nel tuo 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;
}

66

Non utilizzare setSupportActionBar (barra degli strumenti)

Non so perché, ma per me funziona.

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

Per la voce di menu fare clic su Fallo

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

Aggiornerò la parte "perché" di questa risposta quando troverò una spiegazione adeguata.
Felice di aiutare comunque :) Pace.


5
La tua risposta mi allarma, ma non spiega perché non dovrei usarla.
Richard Rout

5
Dovresti spiegare perché non usare setSupportActionBar (barra degli strumenti) invece di dire semplicemente cosa funziona per te.
Vinicius Victor

1
Questa è l'unica cosa che ha funzionato per me. Sto usando Xamarin.Android con una barra degli strumenti personalizzata.
Washington A. Ramos

1
Leggerò di più al riguardo e aggiornerò la risposta @AbhinavSaxena. Buona chiamata
Rohit Singh

Pubblica anche main_activity_layout.xml. Funziona ed è una soluzione eccezionale, ma devi completare la risposta. Riposo che ho fatto nella mia risposta.
Abhinav Saxena

51

Ecco una risposta più completa come riferimento per i futuri visitatori. Di solito utilizzo una barra degli strumenti di supporto ma funziona altrettanto bene in entrambi i casi.

inserisci qui la descrizione dell'immagine

1. Crea un menu xml

Questo sarà dentro res/menu/main_menu.

  • Fare clic con il tasto destro sulla rescartella e scegliere Nuovo> File di risorse Android .
  • Digita main_menuil nome del file.
  • Scegli Menu per il tipo di risorsa.

Incolla il seguente contenuto come antipasto.

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

Puoi fare clic con il pulsante destro del mouse rese scegliere Nuova risorsa immagine per creare il fileic_add icona.

2. Gonfiare il menu

Nella tua attività aggiungi il seguente metodo.

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

3. Gestire i clic del menu

Inoltre, nella tua attività, aggiungi il seguente metodo:

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

Ulteriore lettura


4
Grazie per aver effettivamente mostrato tutti i componenti necessari insieme, invece di solo due righe di codice.
Big_Chair

44

Devi sovrascrivere questo codice nella tua attività:

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

e imposta la barra degli strumenti in questo modo:

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

7

Anche tu hai bisogno di questo, per implementare alcune azioni in ogni opzione del 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;
}

3

Anche se sono d'accordo con questa risposta, poiché ha meno righe di codice e funziona:

Come impostare il menu sulla barra degli strumenti in Android

Il mio suggerimento sarebbe quello di avviare sempre qualsiasi progetto utilizzando la procedura guidata di Android Studio. In quel codice troverai alcuni stili: -

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

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

e l'utilizzo è:

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

A causa di no action bar themedichiarato in styles.xml, che viene applicato a Main Activityin AndroidManifest.xml, non ci sono eccezioni, quindi devi controllarlo lì.

<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. Non Toolbarè un'entità indipendente, è sempre una vista figlio in AppBarLayoutquanto di nuovo è figlio di CoordinatorLayout .
  2. Il codice per la creazione di un menu è il codice standard sin dal primo giorno, che si ripete più e più volte in tutte le risposte, in particolare in quella contrassegnata, ma nessuno ha capito quale sia la differenza.

TUTTI E DUE:

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

E:

Come impostare il menu sulla barra degli strumenti in Android

FUNZIONERÀ.

Buona programmazione :-)


2

Nella tua attività sovrascrivi questo metodo.

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

Questo gonfierà il tuo menu di seguito:

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

Nel mio caso, sto usando un AppBarLayout con un CollapsingToolbarLayout e il menu veniva sempre fatto scorrere fuori dallo schermo, ho risolto il mio problema cambiando android: actionLayout nell'XML del menu con l'ID della barra degli strumenti. Spero che possa aiutare le persone nella stessa situazione!

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

Semplice correzione a questo stava tramontando showAsActiona alwaysin menu.xmlin res / menù

<?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
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 / drawer_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>


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

Bene, è necessario impostare la barra delle azioni di supporto setSupportActionBar (); e passa la tua variabile, in questo modo:setSupportActionBar(toolbar);


0

In XML aggiungi una riga all'interno <Toolbar/>

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

Nel file java, sostituisci questo:

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

con questo:

toolbar.setTitle("Main Page")

0

È comunque possibile utilizzare la risposta fornita utilizzando Toolbar.inflateMenu anche durante l'utilizzo di setSupportActionBar (barra degli strumenti).

Avevo uno scenario in cui dovevo spostare la funzionalità di configurazione della barra degli strumenti in una classe separata al di fuori dell'attività che non conosceva di per sé l'evento suCreateOptionsMenu.

Quindi, per implementare questo, tutto ciò che dovevo fare era aspettare che Toolbar fosse disegnata prima di chiamare inflateMenu facendo quanto segue:

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

Potrebbe non essere considerato molto pulito ma ottiene comunque il lavoro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.