Optionen ausblenden auf PräferenzFragment

Ich habe eine App mit mehreren Fragmenten.

Nur ein Fragment hat ein Optionsmenü. Ein Fragment könnte aus dem Fragment B (das die Listfragment erweitert) initiiert werden.

Also B-Fragment hat kein Optionsmenü, wenn ich ein Element aus ihm auswähle, wird Fragment A mit einem Optionsmenü initiiert und wenn man zurückkommt, hat Fragment B noch kein Optionsmenü.

Das Problem ist, wenn ich das Einstellungsmenü (das die Präferenzfragment erweitert) aus der Navigationsschublade auswählt, während mein aktuelles Fenster das Fragment A ist, wird ein Einstellungsfragment mit dem Optionsmenü aus Fragment A angezeigt. Wenn ich aber das Einstellungsmenü aus der Navigationsschublade wähle, während mein aktuelles Fenster Ist Fragment B, C, D (ohne Optionsmenü) alles funktioniert gut.

Fragment A:

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

Einstellungsfragment:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); sharedPreferenceSettings = new SharedPreferenceSettings(getActivity()); addPreferencesFromResource(R.xml.settings); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_settings, container, false); } 

Wo ist das Problem?

BEARBEITEN:

Nach Stunden des Debuggens fand ich eine Lösung. Das Problem war anders fragmentManager für Fragment-Transaktion. Für Einstellungen Fragment nur habe ich getSupportFragmentManager (), für andere – fragmentManager (). Dies führt dazu, dass einige Fragmente zum Stapel zurückkehren.

  • Optionen-Menü sperrt auf Galaxie s4
  • Hide MenuItem in einigen Fragmenten
  • Optionen-Menü nicht in ICS mit Kompatibilitätsbibliothek anzeigen
  • Wie ändere ich das Optionsmenü in der Aktionsleiste?
  • Wiederholen von Optionen-Menü-Code
  • OnCreateOptionsMenu rief vor onCreate android an
  • Wie kann ich onCreateOptionsMenu in einem Fragment innerhalb einer Registerkarte verwenden? (Sherlock ActionBar)
  • OptionenMenu von Fragmenten im Viewpager, die sich gegenseitig die Schaltflächen anzeigen
  • 2 Solutions collect form web for “Optionen ausblenden auf PräferenzFragment”

    Ich sehe zwei Code-Verdächtigen. Codevorschlag für Fragment A:

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

    Notizen:

    • super.onCreateOptionsMenu() wird normalerweise nach dem Aufblasen aufgerufen. Das ist nicht gut dokumentiert, also bin ich mir nicht sicher, was der Unterschied ist. Eine verwandte SO Post, dass viele stimmt als die beste Antwort ist @ Android Options Menu in Fragment .
    • setHasOptionsMenu(true) wird im selben Fragment anstelle von Settings fragment durchgeführt. Fragmente speichern eigene Daten und Zustände. Man kann die Zustände zwischen den Fragmenten nicht so leicht ändern.

    Von der Lektüre deiner Post, denke ich, solltest du ein temporäres Fragment-Layout verwenden, das durch das gewünschte Fragment ersetzt werden soll. Codevorschlag:

     FragmentManager fragManager = this.getSupportFragmentManager(); MyFragment myFragment = MyFragment.newInstance(); FragmentTransaction fragmentTransaction = fragManager.beginTransaction(); FragmentTransaction transaction = this.getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.sample_content_fragment, myFragment, "MyFrag"); transaction.addToBackStack(null); // support the Back key transaction.commit(); 

    Im Layout :

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/sample_main_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > ... <FrameLayout android:id="@+id/sample_content_fragment" android:layout_width="match_parent" android:layout_height="match_parent" /> ... </LinearLayout> 

    Notizen:

    • Das temporäre Fragment-Layout heißt sample_content_fragment . Dies ist der übergeordnete Container, um einen Fragmentstapel zu pflegen .
    • Diese Technik verwendet nur einen Fragmentstapel, anstatt mehrere Stapel zu verwalten.
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.