2015-08-05 12 views
9

Ho un'app con diversi frammenti.Nascondi menu opzioni su PreferenceFragment

Solo un frammento ha un menu di opzioni. Un frammento può essere avviato dal frammento B (che estende listfragment).

Quindi il frammento B non ha un menu opzioni, se seleziono qualche elemento da esso, il frammento A verrà avviato con un menu opzioni e se si torna indietro, il frammento B non ha ancora un menu opzioni.

Il problema è che se seleziono il menu Impostazioni (che estende la preferenzafragment) dal cassetto di navigazione mentre la mia finestra corrente è il frammento A, un frammento di impostazioni verrà mostrato con il menu opzioni dal frammento A. Ma se seleziono il menu Impostazioni dal cassetto di navigazione mentre la mia finestra corrente è il frammento B, C, D (senza menu opzioni) tutto funziona bene.

Frammento A:

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

    inflater.inflate(R.menu.menu_station, menu); 
} 

Impostazioni frammento:

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

Dov'è il problema?

EDIT:

Dopo ore di debugging ho trovato una soluzione. Il problema era diverso dalla transazione fragmentManager per i frammenti. Solo per frammenti di impostazioni ho usato getSupportFragmentManager(), per altri - fragmentManager(). Questo fa sì che alcuni frammenti passino allo stack posteriore.

+0

Non capisco il tuo quarto paragrafo, mi dispiace. È difficile seguire il flusso logico tra i frammenti e due menu. Se vuoi essere più chiaro, ti suggerisco di separare il codice/flusso logico, un flusso su una linea. Un altro, è disegnare un diagramma del flusso. –

risposta

5

Vedo due sospetti di codice. Codice suggerimento per il frammento 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); 
... 
} 

Note:

  • super.onCreateOptionsMenu() è normalmente chiamato dopo il gonfiaggio. Questo non è ben documentato, quindi non sono sicuro di quale sia la differenza. Un post SO correlato che molti concordano come la risposta migliore è @Android Options Menu in Fragment.
  • setHasOptionsMenu(true) viene eseguito nello stesso frammento anziché in Impostazioni frammento. I frammenti salvano i propri dati e stati. Non è possibile modificare gli stati tra i frammenti così facilmente.
3

Dalla lettura del post, penso che dovresti usare un layout di frammento temporaneo per essere sostituito dal frammento desiderato. Codice suggerimento:

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

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

Note:

  • Il layout frammento temporanea si chiama sample_content_fragment. Questo è il contenitore genitore per mantenere uno stack di frammenti.
  • Questa tecnica utilizza solo una pila di frammenti da gestire invece di diversi stack.
Problemi correlati