Quando si utilizza il cassetto di navigazione, gli sviluppatori Android raccomandano che nell'ActionBar "solo le schermate rappresentate nel cassetto di navigazione dovrebbero effettivamente avere l'immagine del cassetto di navigazione" e che "tutte le altre schermate abbiano il carato tradizionale".
Vedi qui per i dettagli: http://youtu.be/F5COhlbpIbY
Sto usando un'attività per controllare più livelli di frammenti e riesco a far visualizzare e funzionare l'immagine del Navigatore a tutti i livelli.
Quando si creano frammenti di livello inferiore, posso chiamare ActionBarDrawerToggle
setDrawerIndicatorEnabled(false)
per nascondere l'immagine del cassetto di navigazione e visualizzare il cursore Su
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag, "lowerFrag").addToBackStack(null).commit();
Il problema che sto riscontrando è quando torno indietro ai frammenti di livello superiore che mostra ancora il carato invece dell'immagine originale del Navigatore. Qualche suggerimento su come "aggiornare" la ActionBar sui frammenti di livello superiore per visualizzare nuovamente l'immagine del Navigatore?
Soluzione
Il suggerimento di Tom ha funzionato per me. Ecco cosa ho fatto:
Attività principale
Questa attività controlla tutti i frammenti nell'app.
Quando preparo nuovi frammenti per sostituirne altri, imposto DrawerToggle in setDrawerIndicatorEnabled(false)
questo modo:
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag).addToBackStack(null).commit();
Successivamente, in una sostituzione di onBackPressed
, ho ripristinato quanto sopra impostando DrawerToggle in setDrawerIndicatorEnabled(true)
questo modo:
@Override
public void onBackPressed() {
super.onBackPressed();
// turn on the Navigation Drawer image;
// this is called in the LowerLevelFragments
setDrawerIndicatorEnabled(true)
}
In LowerLevelFragments
Nei frammenti ho modificato onCreate
e onOptionsItemSelected
così:
In onCreate
aggiunta setHasOptionsMenu(true)
per abilitare la configurazione del menu delle opzioni. Impostare anche setDisplayHomeAsUpEnabled(true)
per abilitare < nella barra delle azioni:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// needed to indicate that the fragment would
// like to add items to the Options Menu
setHasOptionsMenu(true);
// update the actionbar to show the up carat/affordance
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
}
Quindi onOptionsItemSelected
ogni volta che si preme < chiama onBackPressed()
dall'attività per salire di un livello nella gerarchia e visualizzare l'immagine del cassetto di navigazione:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Get item selected and deal with it
switch (item.getItemId()) {
case android.R.id.home:
//called when the up affordance/carat in actionbar is pressed
getActivity().onBackPressed();
return true;
…
}
.replace(R.id.frag_layout
. Se questo è un altro livello di gerarchia, mi aspetterei che tu .add
sia nel backstack.
theDrawerToggle.setDrawerIndicatorEnabled(false);
interno del frammento? Penso che sia dichiarato nel file di classe Main Activity. Non riesco a trovare un modo per fare riferimento a questo. Qualche suggerimento?
setDisplayOptions()
metodo all'interno del ToolbarWidgetWrapper
(del pacchetto interno android.support.v7.internal.widget) non ricreare l'icona quando si inserisce lo stesso frammento una seconda volta. Lasciandolo qui per quando anche altri si imbattono in questo problema.