Ich versuche, aus einer Gruppe von Fragmenten ein Element zum Optionsmenü hinzuzufügen.
Ich habe eine neue MenuFragment
Klasse erstellt und diese für die Fragmente erweitert, in die ich den Menüpunkt aufnehmen möchte. Hier ist der Code:
Java:
public class MenuFragment extends Fragment {
MenuItem fav;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
fav = menu.add("add");
fav.setIcon(R.drawable.btn_star_big_off);
}
}
Kotlin:
class MenuFragment : Fragment {
lateinit var fav: MenuItem
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
fav = menu.add("add");
fav.setIcon(R.drawable.btn_star_big_off);
}
}
Aus irgendeinem Grund onCreateOptionsMenu
scheint das nicht zu laufen.
android
android-fragments
android-optionsmenu
Misterbassman
quelle
quelle
Antworten:
Nennen Sie die Supermethode:
Java:
Kotlin:
Fügen Sie Protokollanweisungen in den Code ein, um festzustellen, ob die Methode nicht aufgerufen wird oder ob das Menü nicht durch Ihren Code geändert wird.
Auch stellen Sie sicher , rufen
setHasOptionsMenu(boolean)
inonCreate(Bundle)
das Fragment zu informieren , dass es in Optionsmenü Handhabung teilnehmen sollten.quelle
Ich hatte das gleiche Problem, aber ich denke, es ist besser, den letzten Schritt zusammenzufassen und einzuführen, damit es funktioniert:
Fügen Sie der Methode Ihres Fragments die
onCreate(Bundle savedInstanceState)
Methode setHasOptionsMenu (true) hinzu .Überschreiben Sie
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
(wenn Sie im Menü Ihres Fragments etwas anderes tun möchten) undonOptionsItemSelected(MenuItem item)
Methoden in Ihrem Fragment.In deinem
onOptionsItemSelected(MenuItem item)
der Methode Aktivität sicher, dass Sie false zurückgeben, wenn die Menüelementaktion in deronOptionsItemSelected(MenuItem item)
Fragment-Methode implementiert wird.Ein Beispiel:
Aktivität
Fragment
quelle
setHasOptionsMenu(true);
DankeWenn Sie feststellen, dass die
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
Methode nicht aufgerufen wird, rufen Sie in der Methode des Fragments Folgendes aufonCreate(Bundle savedInstanceState)
:quelle
Toolbar
und musste rufensetHasOptionsMenu(true)
inonCreateView()
statt ,onCreate()
um es getan.Wenn Sie ein benötigen
menu
, umwebview
ein bestimmtes Objekt zu aktualisierenFragment
, können Sie Folgendes verwenden:Fragment :
menu.xml
quelle
TL; DR
Verwenden Sie die
android.support.v7.widget.Toolbar
und tun Sie einfach:Standalone-Symbolleiste
Die meisten der vorgeschlagenen Lösungen
setHasOptionsMenu(true)
funktionieren nur, wenn die übergeordnete Aktivität die Symbolleiste im Layout hat und über deklariertsetSupportActionBar()
. Dann können die Fragmente an der Menüpopulation dieser genauen ActionBar teilnehmen :Wenn Sie eine eigenständige Symbolleiste und ein Menü für ein bestimmtes Fragment wünschen , können Sie Folgendes tun:
menu_custom_fragment.xml
custom_fragment.xml
CustomFragment.kt
Ja, so einfach ist das. Sie müssen nicht einmal überschreiben
onCreate()
oderonCreateOptionsMenu()
.PS: Dies funktioniert nur mit
android.support.v4.app.Fragment
undandroid.support.v7.widget.Toolbar
(verwenden Sie auchAppCompatActivity
einAppCompat
Thema in Ihremstyles.xml
).quelle
In
menu.xml
sollten Sie alle Menüpunkte hinzufügen. Anschließend können Sie Elemente ausblenden, die beim ersten Laden nicht angezeigt werden sollen.menu.xml
Fügen Sie
setHasOptionsMenu(true)
die onCreate () -Methode hinzu, um die Menüelemente in Ihrer Fragment-Klasse aufzurufen.FragmentClass.java
Sie müssen
onCreateOptionsMenu
Ihre Fragment-Klasse nicht erneut überschreiben . Menüelemente können durch Überschreiben deronPrepareOptionsMenu
in Fragment verfügbaren Methode geändert (Hinzufügen / Entfernen) werden .quelle
Sie müssen menu.clear () verwenden, bevor Sie Menüs aufblasen.
und
quelle
In meinem Fall sind hier die Schritte.
Schritt 1
Schritt 2
Schritt 3
quelle
menu.clear()
zuvor gelöschten Menü. Arbeitete für mich :)Wenn Sie Ihr Menü benutzerdefiniert hinzufügen möchten
quelle
Ich hatte das gleiche Problem, meine Fragmente waren Seiten eines ViewPagers. Der Grund dafür ist, dass ich beim Instanziieren von FragmentPagerAdapter eher den untergeordneten Fragmentmanager als den Aktivitätsunterstützungsfragmentmanager verwendet habe.
quelle
Menü Datei:
Aktivitätscode:
Fragmentcode:
quelle
Ihr Code ist in Ordnung. In der Methode fehlte nur der Super:
quelle
Ich wurde verrückt, weil keine der Antworten hier für mich funktionierte.
Um das Menü anzuzeigen, musste ich anrufen:
setSupportActionBar(toolbar)
Erledigt!
Hinweis: Wenn sich Ihre
toolbar
Ansicht nicht im selben Aktivitätslayout befindet, können Sie den obigen Aufruf nicht direkt von Ihrer Aktivitätsklasse aus verwenden. In diesem Fall müssen Sie diese Aktivität von Ihrer Fragmentklasse abrufen und dann die aufrufensetSupportActionBar(toolbar)
. Denken Sie daran: Ihre Aktivitätsklasse sollte die AppCompatActivity erweitern.Hoffe, dass diese Antwort Ihnen hilft.
quelle
Das Einstellen des Optionsmenüs nach dem Erstellen der Fragmentansicht hat bei mir gut funktioniert.
quelle
Mein Problem war etwas anders. Ich habe alles richtig gemacht. Aber ich habe die falsche Klasse für die Aktivität geerbt, die das Fragment hostet.
Wenn Sie
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
das Fragment überschreiben , stellen Sie sicher, dass Ihre Aktivitätsklasse, die dieses Fragment hostet, erbtandroid.support.v7.app.ActionBarActivity
(falls Sie unter API-Ebene 11 unterstützen möchten).Ich habe die
android.support.v4.app.FragmentActivity
API-Stufe unter 11 geerbt .quelle
Eine Sache würde ich hinzufügen und den Grund, warum es bei mir nicht funktionierte.
Es ist ähnlich wie Napsters Antwort.
Stellen Sie sicher, dass die Hosting-Aktivität Ihres Fragments erweitert wird
AppCompatActivity
, nichtFragmentActivity
!Von der Google Referenz - Dokumentation für FragmentActivity:
ActionBarActivity
Verwenden SieAppCompatActivity
stattdessen Napsters Antwort, die jetzt veraltet ist .AppCompatActivity
Stellen Sie bei der Verwendung außerdem sicher, dass Sie "das Aktivitätsthema aufTheme.AppCompat
oder ein ähnliches Thema" (Google Doc) festlegen .Hinweis:
android.support.v7.app.AppCompatActivity
ist eine Unterklasse derandroid.support.v4.app.FragmentActivity
Klasse (siehe AppCompatActivity ref doc).quelle
Erstellen Sie in Ihrem Menüordner eine Menü-XML-Datei und fügen Sie diese XML hinzu
Überschreiben Sie in Ihrer Fragmentklasse diese Methode und
Richten Sie jetzt einfach Ihre Menü-XML-Datei in der Fragmentklasse ein
quelle
Wenn alle oben genannten Funktionen nicht funktionieren, müssen Sie debuggen und sicherstellen, dass die Funktion onCreateOptionsMenu aufgerufen wurde (indem Sie ein Debug- oder Schreibprotokoll platzieren ...).
Wenn es nicht ausgeführt wird, unterstützt Ihr Android-Design möglicherweise die Aktionsleiste nicht. Öffnen AndroidManifest.xml und der Wert für die
android:theme
mit Theme - Unterstützung Aktionsleiste :quelle
Fügen Sie auf Ihrer onCreate- Methode setHasOptionMenu () hinzu.
Überschreiben Sie dann Ihr onCreateOptionsMenu
quelle