Android-Optionen-Menü in Fragment

Ich versuche, ein Element zum Optionsmenü aus einer Gruppe von Fragmenten hinzuzufügen.

Ich habe eine neue MenuFragment Klasse erstellt und diese für die Fragmente erweitert, die ich in den Menüpunkt einfügen möchte. Hier ist der Code:

  • Behandle NFC, während das Telefon in Android schläft
  • Was ist MergeRootFrame in FrameLayout?
  • Android ActionBar-Menü mit vertikalen (gedrehten) Textelementen basierend auf Custom Action Provider
  • Dolch mit Android: Wie man Kontext bei der Verwendung von MVP injiziert?
  • Wählen Sie Text in TextView kopieren?
  • Flow Textansicht um Bild
  •  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); } } 

    Aus irgendeinem Grund scheint das onCreateOptionsMenu nicht zu laufen.

  • Xamarin.Forms: falsche Taste Textausrichtung nach Klick (Android)
  • Wie kann man Besuchern einer mobilen Website offline Zugriff auf CouchDB Daten geben?
  • Android Front Facing Kamera Mit umgekehrten Fotos
  • Gleiten - Einzelbild von Video zu bestimmten Zeiten laden?
  • Android 9-Patch Hintergrundbild Initial PNG Größe?
  • Wie kann ich wissen, wann MediaRecorder das Schreiben von Daten in Datei abgeschlossen hat
  • 15 Solutions collect form web for “Android-Optionen-Menü in Fragment”

    Rufen Sie die Super-Methode:

     @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // TODO Add your menu entries here super.onCreateOptionsMenu(menu, inflater); } 

    Setzen Sie Log-Anweisungen in den Code, um zu sehen, ob die Methode nicht aufgerufen wird oder wenn das Menü nicht durch Ihren Code geändert wird.

    SetHasOptionsMenu Sie sich auch, dass Sie SetHasOptionsMenu in onCreate , um das Fragment zu benachrichtigen, dass es an der SetHasOptionsMenu onCreate teilnehmen soll.

    Wenn Sie das onCreateOptionsMenu(Menu menu, MenuInflater inflater) -Methode nicht aufrufen, stellen Sie sicher, dass Sie das folgende aus der Fragment's onCreate(Bundle savedInstanceState) Methode onCreate(Bundle savedInstanceState) :

     setHasOptionsMenu(true) 

    Ich hatte das gleiche Problem, aber ich denke es ist besser, zusammenzufassen und den letzten Schritt vorzustellen, um es zu arbeiten:

    1. Füge setHasOptionsMenu (true) -Methode in deiner Fragment's onCreate(Bundle savedInstanceState) -Methode hinzu.

    2. Override onCreateOptionsMenu(Menu menu, MenuInflater inflater) (wenn du in deinem Fragment-Menü etwas anderes machen willst) und onOptionsItemSelected(MenuItem item) Methoden in deinem Fragment.

    3. Innerhalb Ihrer onOptionsItemSelected(MenuItem item) Activity-Methode stellen Sie sicher, dass Sie false zurückgeben, wenn die Menüpunktaktion in onOptionsItemSelected(MenuItem item) Fragment's Methode implementiert werden würde.

    Ein Beispiel:

    Aktivität

     @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.activity_menu_item: // Do Activity menu item stuff here return true; case R.id.fragment_menu_item: // Not implemented here return false; default: break; } return false; } 

    Fragment

     public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); .... } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Do something that differs the Activity's menu here super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.activity_menu_item: // Not implemented here return false; case R.id.fragment_menu_item: // Do Fragment menu item stuff here return true; default: break; } return false; } 

    In meinem Fall brauchte ich ein Menü, um eine webview in einem bestimmten Fragment zu webview , dafür habe ich verwendet:

    Fragment :

     public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // TODO Add your menu entries here inflater.inflate(R.menu.menu, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.exit: System.exit(1); break; case R.id.refresh: webView.reload(); break; } return true; } 

    Datei menu.xml

     <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/exit" android:title="Exit" android:icon="@drawable/ic_action_cancel" /> <item android:id="@+id/refresh" android:title="Refresh" android:icon="@drawable/ic_action_refresh" /> </menu> 

    In der menu.xml sollten Sie alle Menüpunkte hinzufügen. Dann kannst du Gegenstände ausblenden, die du bei der Erstbelastung nicht sehen möchtest.

    Menu.xml

     <item android:id="@+id/action_newItem" android:icon="@drawable/action_newItem" android:showAsAction="never" android:visible="false" android:title="@string/action_newItem"/> 

    setHasOptionsMenu(true) in der Methode onCreate () hinzu, um die Menüpunkte in deiner Fragmentklasse aufzurufen.

    FragmentClass.java

     @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } 

    Sie müssen nicht onCreateOptionsMenu in Ihrer Fragment-Klasse erneut überschreiben. Menüpunkte können geändert werden (Hinzufügen / Remoev) durch Überschreiben von onPrepareOptionsMenu Methode, die in Fragment verfügbar ist.

     @Override public void onPrepareOptionsMenu(Menu menu) { menu.findItem(R.id.action_newItem).setVisible(true); super.onPrepareOptionsMenu(menu); } 

    Sie müssen menu.clear () vor dem Aufblasen von Menüs verwenden.

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

    und

     @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } 

    Ich habe das gleiche Problem, meine Fragmente waren Seiten eines ViewPagers. Der Grund, warum es geschah, ist, dass ich mit Kind Fragment Manager anstatt der Aktivität Unterstützung Fragment Manager bei der Instanziierung FragmentPagerAdapter.

    Wenn du dein Menü benutzerdefinierte hinzufügen möchtest

     @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_custom, menu); } 

    Menü-Datei:

     <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/play" android:titleCondensed="Speak" android:showAsAction="always" android:title="Speak" android:icon="@drawable/ic_play"> </item> <item android:id="@+id/pause" android:titleCondensed="Stop" android:title="Stop" android:showAsAction="always" android:icon="@drawable/ic_pause"> </item> </menu> 

    Aktivitätscode:

     @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.speak_menu_history, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.play: Toast.makeText(getApplicationContext(), "speaking....", Toast.LENGTH_LONG).show(); return false; case R.id.pause: Toast.makeText(getApplicationContext(), "stopping....", Toast.LENGTH_LONG).show(); return false; default: break; } return false; } 

    Fragmentcode:

     @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.play: text = page.getText().toString(); speakOut(text); // Do Activity menu item stuff here return true; case R.id.pause: speakOf(); // Not implemented here return true; default: break; } return false; } 

    Mein Problem war etwas anders. Ich habe alles richtig gemacht Aber ich habe die falsche Klasse für die Aktivität, die das Fragment beherbergt, geerbt.

    onCreateOptionsMenu(Menu menu, MenuInflater inflater) also klar zu sein, wenn Sie auf onCreateOptionsMenu(Menu menu, MenuInflater inflater) im Fragment onCreateOptionsMenu(Menu menu, MenuInflater inflater) , stellen Sie sicher, dass Ihre Aktivitätsklasse, die dieses Fragment beherbergt, android.support.v7.app.ActionBarActivity erbt (falls Sie unterhalb der API unterstützen möchten) Stufe 11).

    Ich erbte die android.support.v4.app.FragmentActivity , um API Level unter 11 zu unterstützen.

    Eine Sache würde ich dazu hinzufügen und der Grund, dass es nicht für mich funktioniert.

    Es ähnelt Napster's Antwort.

    1. Vergewissern Sie sich, dass Ihr Fragment Hosting-Aktivität AppCompatActivity , nicht FragmentActivity !

       public class MainActivity extends AppCompatActivity { } 

      Von der Google-Referenzdokumentation für FragmentActivity:

      Hinweis: Wenn Sie eine Aktivität implementieren möchten, die eine Aktionsleiste enthält, sollten Sie stattdessen die ActionBarActivity-Klasse verwenden, die eine Unterklasse dieser Datei ist. So können Sie Fragment-APIs auf API-Ebene 7 und höher verwenden.

    2. Um die Antwort von Napster zu aktualisieren – ActionBarActivity jetzt abgelehnt wird, verwenden AppCompatActivity stattdessen AppCompatActivity .

    3. Wenn Sie AppCompatActivity , stellen Sie außerdem sicher, dass Sie "the Theme.AppCompat theme to Theme.AppCompat oder ein ähnliches Thema" (Google Doc.) Theme.AppCompat .

    Hinweis: android.support.v7.app.AppCompatActivity ist eine Unterklasse der android.support.v4.app.FragmentActivity Klasse (siehe AppCompatActivity ref doc).

    In Ihrem Menüordner eine .menu xml-Datei und füge diese xml hinzu

     <item android:id="@+id/action_search" android:icon="@android:drawable/ic_menu_search" android:title="@string/action_search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="always|collapseActionView" /> 

    In deiner Fragmentklasse über diese Methode und

     implement SearchView.OnQueryTextListener in your fragment class @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); setHasOptionsMenu(true); } 

    Jetzt nur Setup Ihr ​​Menü XML-Datei in Fragment-Klasse

     @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_main, menu); final MenuItem item = menu.findItem(R.id.action_search); final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item); MenuItemCompat.setOnActionExpandListener(item, new MenuItemCompat.OnActionExpandListener() { @Override public boolean onMenuItemActionCollapse(MenuItem item) { // Do something when collapsed return true; // Return true to collapse action view } @Override public boolean onMenuItemActionExpand(MenuItem item) { // Do something when expanded return true; // Return true to expand action view } }); } 

    Das Einstellen des Optionsmenüs nach dem Erstellen der Fragmentansicht funktionierte gut für mich.

     @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); } 

    Wenn alle oben genannten funktioniert nicht, müssen Sie debuggen und sicherstellen, dass Funktion onCreateOptionsMenu aufgerufen wurde (indem Sie Debug- oder Schreibprotokoll …)

    Wenn es nicht läuft, vielleicht ist Ihr Android-Thema nicht unterstützt die Aktionsleiste. Öffnen Sie AndroidManifest.xml und legen Sie den Wert für android:theme mit Themen-Support-Aktionsleiste :

      <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/Theme.AppCompat"> 

    Auf deiner onCreate- Methode add setHasOptionMenu ()

     @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } 

    Dann überschreiben Sie Ihr onCreateOptionsMenu

     @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.add("Menu item") .setIcon(android.R.drawable.ic_delete) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.