So stellen Sie das Menü in Android auf Symbolleiste ein

94

Ich möchte ToolBarstattdessen verwenden ActionBar, aber zeige mir kein Menü in der Symbolleiste !!! Ich möchte ein Menü wie Aktualisieren oder Einstellen von Schaltflächen in ActionBar.

Geben Sie hier die Bildbeschreibung ein

Toolbar.xml Code:

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

Wie behebe ich dieses Problem und zeige das Menü in Toolbar? Vielen Dank an alle Lieben <3

Dr.NoBody
quelle
4
Sie können hier überprüfen: stackoverflow.com/questions/31231609/…
Chol
2
Dies ist, was mir fehlte toolbar.inflateMenu (R.menu.main_manu);
Skryshtafovych
Versuchen Sie, eine neue Anwendung mit zu erstellen, Android Studiound checken Sie sie aus. `ToolBar 'sollte keine unabhängige Einheit sein.
Abhinav Saxena

Antworten:

152

Überschreiben Sie einfach onCreateOptionsMenu wie folgt in Ihrer 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
quelle
62

Verwenden Sie nicht setSupportActionBar (Symbolleiste)

Ich weiß nicht warum, aber das funktioniert bei mir.

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

Klicken Sie für den Menüpunkt auf dies

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

Aktualisiert den "Warum" -Teil dieser Antwort, wenn ich eine richtige Erklärung finde.
Gerne trotzdem helfen :) Frieden.

Rohit Singh
quelle
5
Sie beantworten Alarmmeldungen, aber es erklärt nicht, warum ich es nicht verwenden sollte.
Richard Rout
5
Sie sollten erklären, warum Sie setSupportActionBar (Symbolleiste) nicht verwenden sollten, anstatt nur zu sagen, was für Sie funktioniert.
Vinicius Victor
1
Dies ist das einzige, was für mich funktioniert hat. Ich verwende Xamarin.Android mit einer benutzerdefinierten Symbolleiste.
Washington A. Ramos
1
Ich werde mehr darüber lesen und die Antwort @AbhinavSaxena aktualisieren. Guter Anruf
Rohit Singh
Bitte posten Sie auch die Datei main_activity_layout.xml. Dies funktioniert und ist eine hervorragende Lösung, aber Sie müssen die Antwort vervollständigen. Ruhe habe ich in meiner Antwort getan.
Abhinav Saxena
50

Hier finden Sie eine ausführlichere Antwort als Hinweis auf zukünftige Besucher. Normalerweise verwende ich eine Support-Symbolleiste, aber sie funktioniert in beiden Fällen genauso gut.

Geben Sie hier die Bildbeschreibung ein

1. Erstellen Sie eine Menü-XML

Das wird in sein res/menu/main_menu.

  • Klicken Sie mit der rechten Maustaste auf den resOrdner und wählen Sie Neu> Android-Ressourcendatei .
  • Geben Sie main_menuden Dateinamen ein.
  • Wählen Sie als Ressourcentyp Menü.

Fügen Sie als Starter den folgenden Inhalt ein.

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

Sie können mit der rechten Maustaste klicken resund Neues Bildelement auswählen , um das ic_addSymbol zu erstellen .

2. Blasen Sie das Menü auf

Fügen Sie in Ihrer Aktivität die folgende Methode hinzu.

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

3. Behandeln Sie Menüklicks

Fügen Sie in Ihrer Aktivität die folgende Methode hinzu:

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

Weiterführende Literatur

Suragch
quelle
4
Vielen Dank, dass Sie tatsächlich alle erforderlichen Komponenten zusammen anzeigen, anstatt nur zwei Codezeilen.
Big_Chair
43

Sie müssen diesen Code in Ihrer Aktivität überschreiben:

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

und stellen Sie Ihre Symbolleiste folgendermaßen ein:

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

Außerdem benötigen Sie dies, um eine Aktion für alle Menüoptionen zu implementieren.

@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.
quelle
3

Obwohl ich dieser Antwort zustimme, da sie weniger Codezeilen enthält und funktioniert:

So stellen Sie das Menü in Android auf Symbolleiste ein

Mein Vorschlag wäre, jedes Projekt immer mit dem Android Studio-Assistenten zu starten. In diesem Code finden Sie einige Stile: -

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

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

und Verwendung ist:

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

Aufgrund der no action bar themedeklarierten in styles.xml, die auf die Main Activityin der angewendet wird AndroidManifest.xml, gibt es keine Ausnahmen, so dass Sie es dort überprüfen müssen.

<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. Das Toolbarist keine unabhängige Entität, es ist immer eine untergeordnete Ansicht, in AppBarLayoutder wiederum das Kind von ist CoordinatorLayout.
  2. Der Code zum Erstellen eines Menüs ist der Standardcode seit dem ersten Tag, der in allen Antworten, insbesondere in der markierten, immer wieder wiederholt wird, aber niemand hat erkannt, was der Unterschied ist.

BEIDE:

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

UND:

So stellen Sie das Menü in Android auf Symbolleiste ein

WIRD FUNKTIONIEREN.

Viel Spaß beim Codieren :-)

Abhinav Saxena
quelle
2

Überschreiben Sie in Ihrer Aktivität diese Methode.

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

Dadurch wird Ihr Menü unten aufgeblasen:

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

In meinem Fall verwende ich ein AppBarLayout mit einem CollapsingToolbarLayout und das Menü wurde immer vom Bildschirm gescrollt. Ich habe mein Problem gelöst, indem ich android: actionLayout im XML des Menüs auf die ID der Symbolleiste umgestellt habe. Ich hoffe, es kann Menschen in der gleichen Situation helfen!

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

Einfache Lösung , um diese einstellt showAsActionzu 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>
Windula Kularatne
quelle
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>

Meysam Keshvari
quelle
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);
}

Nun, Sie müssen die Support-Aktionsleiste setSupportActionBar () festlegen. und übergeben Sie Ihre Variable wie folgt:setSupportActionBar(toolbar);

Kalaiyo5
quelle
0

Fügen Sie in XML eine Zeile hinzu <Toolbar/>

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

Ersetzen Sie in der Java-Datei Folgendes:

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

mit diesem:

toolbar.setTitle("Main Page")
Bhanwar
quelle