Android-Symbolleiste Hinzufügen von Menüelementen für verschiedene Fragmente

87

Ich habe eine Symbolleiste sowie eine Navigationsleiste. Wenn ich meine App starte, werden die Symbolleiste und die Navigationsleiste erstellt. Wenn ich in der Navigationsleiste auf Elemente klicke, werden neue Fragmente gestartet und die gleiche Symbolleiste beibehalten. Wie füge ich der Symbolleiste grundsätzlich Menüelemente wie Suchen, Hinzufügen, Bearbeiten hinzu, wenn ich bestimmte Fragmente starte? Ich möchte sie nicht zu Beginn des Programms, sondern dynamisch erstellen. Wie könnte ich auf diese Schaltflächen klicken und sie andere Fragmente starten lassen? Ich möchte, dass in einem Fragment die Schaltfläche "Bearbeiten" in der Symbolleiste eine bestimmte Funktion ausführt, verglichen mit der Schaltfläche "Bearbeiten" in einem anderen Fragment. Vielen Dank!

Menu_toolbar:

<?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/edit"
    android:orderInCategory="1"
    android:title="Edit"
    app:showAsAction="always"
    android:icon="@drawable/pencil_icon"/>
<item android:id="@+id/add"
    android:orderInCategory="1"
    android:title="Add"
    app:showAsAction="always"
    android:icon="@drawable/plus_icon"/>

Symbolleiste:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="#10a1ff"
android:title="Home"
/>
Joe Eigi
quelle

Antworten:

162

Fügen Sie Ihren Fragmenten ähnlichen Code hinzu:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
{
    View v = inflater.inflate(R.layout.library_fragment, parent, false);
    setHasOptionsMenu(true);
    return v;
}


@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
   inflater.inflate(R.menu.your_menu_xml, menu);
   super.onCreateOptionsMenu(menu, inflater);
}

Auf diese Weise können Sie das Menü für Ihre Fragmente anpassen.

Gundu Bandgar
quelle
19
Dies ist die richtige Antwort, da der Aufruf von setHasOptionsMenu (true) für die im Fragment aufgerufene onCreateOptionsMenu-Methode erforderlich ist.
John Slavick
15
Denken Sie daran , über Aufruf menu.clear()in onCreateOptionsMenu- sonst werden Sie das Menü aus dem übergeordneten erben, auch.
Dart Dega
@DartDega wo ich Code zum Löschen setzen? Fragment oder Aktivität Sir, ich sehe kein Menü in meinem Fragment
famfamfam
Funktioniert dies mit API Level 28? Ich sehe immer noch die Hauptmenüs für Aktivitäten
ArdenDev
33

So erstellen Sie ein Menü dynamisch: http://www.101apps.co.za/index.php/articles/using-toolbars-in-your-apps.html

Bearbeitet:

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);
actionBarToolBar.setNavigationIcon(R.drawable.icon);
actionBarToolBar.setNavigationContextDescription(getResources().getString(R.string.desc);
actionBarToolBar.setLogo(R.drawable.other_icon);
actionBarToolBar.setLogoDescription(getResources().getString(R.string.other_desc);
actionBarToolBar.inflateMenu(R.menu.fragment_menu);
Allen Chan
quelle
4
Verwenden Sie actionBarToolbar.setOnMenuItemClickListener()diese Option, um Menüelementaktionen auszuführen. onOptionsItemSelected()wird in dieser Situation nicht angerufen.
Lahiru Chandima
2
gegebener Link ist nicht mehr
Ashvin Solanki
24

Der beste Weg, es zu tun:

1. Suchen Sie die Symbolleiste in Aktivität und legen Sie sie als supportActionBar fest.

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);

2. Dann ist es ein Kinderspiel, Optionsmenüs für verschiedene Fragmente in derselben Aktivität zu verwalten. Führen Sie in jedem Fragment die folgenden Schritte aus, wie Sie möchten:

Im OnCreateView-Methodenaufruf

setHasOptionsMenu(true);

Und zuletzt,

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

Und um Menüelemente zu verwalten, klicken Sie auf onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_search :
            Log.i("item id ", item.getItemId() + "");
        default:
            return super.onOptionsItemSelected(item);
    }
}
Prateek Gupta
quelle
1
setHasOptionsMenu (true) ist wirklich hilfreich! Danke
J.Dragon
10

Überschreiben Sie die onCreateOptionsMenuMethode in jedem Fragment.

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.your_menu_xml, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
Ellie Zou
quelle
@ JoeEigi Warum willst du eine andere Symbolleiste? Sie können verschiedene Titel und Menüs festlegen.
Ellie Zou
@ JoeEigi Ja, Sie können ein benutzerdefiniertes Menü haben, indem Sie ein benutzerdefiniertes Menü xml aufblasen. Anruf setTitle()kann Titel hinzufügen.
Ellie Zou
@ JoeEigi Scheint, Sie haben den falschen Kontext, sehen Sie sich das an: stackoverflow.com/questions/26998455/…
Allen Chan
1
Ich habe die Aktionsleiste in meinem Manifest deaktiviert, werde aber weiterhin in meinem Aktivitätslayout über der Symbolleiste angezeigt. Wie werde ich das los
Joe Eigi
Ja, habe das getan und erscheint immer noch in meinem Layout, ist aber nicht mehr zu sehen
Joe Eigi
7

Die einfachste Option ist zu tun

toolbar.inflateMenu(R.menu.fragment_menu);
Guillaume
quelle
4

Ich habe dieses Problem richtig gelöst. Meine Lösung lautet wie folgt:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    mRootView = inflater.inflate(R.layout.fragment_order_history, container, false);
    //getActivity().invalidateOptionsMenu();


    setHasOptionsMenu(true);

    return mRootView;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);
    super.onCreateOptionsMenu(menu, inflater);
}
Hai Rom
quelle
Ja, ich habe das Menü richtig angezeigt. Aber wie man dieses Menü beim Schließen eines Fragments ausblendet, meine ich Wenn wir zu einem anderen Fragment wechseln, z. B. von a -> b, ist das Menü von a noch in der Symbolleiste von Fragment b sichtbar.
Zeeshan Ahmed
Verwenden Sie setHasOptionsMenu (false) in onCreateView von Fragment b.
Kannan_SJD
4

Ich hatte das gleiche Problem und wollte das Symbolleistenmenü entsprechend dem angezeigten Fragment ersetzen.

Das Problem, mit dem ich jetzt konfrontiert bin, ist, dass das Menü zum vorherigen hinzugefügt wird.

Um nur das Menü für das Fragment anzuzeigen, schlage ich vor:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
     menu.clear(); //Empty the old menu
     inflater.inflate(R.menu.menu_fragment1, menu);
     super.onCreateOptionsMenu(menu, inflater);
}

Hoffe es wird helfen.

Matteo Gariglio
quelle
2
Überprüfen Sie einfach, ob menu! = null ist, bevor Sie .clear ()
aufrufen
2

Im Folgenden finden Sie die Schritte zum Anzeigen verschiedener Menüoptionen mit unterschiedlichen Fragmenten.

Schritt 1: Rufen Sie setHasOptionsMenu (true) auf.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        setHasOptionsMenu(true)
        super.onViewCreated(view, savedInstanceState)

    }

Schritt 2: Blasen Sie Ihre fragmentbezogenen Optionsmenüelemente auf.

override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
    // To clear previously added menu items
    menu?.clear()
    inflater?.inflate(R.menu.your_fragment_menu, menu)
    super.onCreateOptionsMenu(menu, inflater)
}
Takharsh
quelle
Dies half mir, unerwünschte Menüschaltflächen zu entfernen, die in meinem neuen Menü angezeigt wurden
Im Batman
1

Fügen Sie in XML diese Zeile hinzu

app:menu="@menu/main_menu"
Mohamed AbdelraZek
quelle
1
Eigentlich hast du recht! Sie können es per XML und dann im Fragment angeben: `` `Spaß überschreiben onViewCreated (Ansicht: View, savedInstanceState: Bundle?) {Super.onViewCreated (Ansicht, savedInstanceState) toolBar.setNavigationOnClickListener {activity? .OnBackPressed ()} searchView = toolBar.menu.findItem (R.id.action_search) .actionView als SearchView searchView.setOnQueryTextListener (this)} `` `
user3193413
-1

Mit der neuen MaterialToolbar ist es sehr einfach, ein Überlaufmenü zu erstellen und Folgendes zu verwenden:

<com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?attr/actionBarSize"
        app:navigationIcon="@drawable/ic_menu"
        app:menu="@menu/main_menu"/>

und dann im Code zum Festlegen der OnCLick-Listener einfach Folgendes hinzufügen:

toolbar.setOnMenuItemClickListener {
            // .. DO SOMETHING HERE
            false
        }
Amin Keshavarzian
quelle