10

Per favore, spiegami ... Io ho il Navigatore nel mio Activity e si sincronizza con Toolbar (come ActionBar). L'attività ha pochi frammenti e in diversi frammenti ho bisogno di usare diverse modalità AppBar (parallasse in una, semplice in un'altra). Quindi, penso che dovrei impostare CoordinatorLayout in ogni frammento con AppBar e contenuto.
Ma come posso sostituire l'ultima barra degli strumenti su nuovo per salvare la sincronizzazione con Drawer? O è il modo sbagliato e ho bisogno di farne qualcos'altro?Barra degli strumenti diversa per frammenti e Cassetto di navigazione

risposta

-1

Se si utilizza DrawerLayout e NavigationView per il vostro cassetto navigazione, migliore soluzione secondo me sarebbe quella di utilizzare individuale DrawerLayout per ciascuno dei layout frammento e utilizzare il AppBarLayout nel corpo del DrawerLayout modo diverso per ciascuno dei frammenti.

+1

Questa è l'unica soluzione?Dovrò ricollegare quasi tutte le gerarchie di viste –

+0

È necessario comprendere che si sta tentando di modificare una vista corpo e non la vista genitore poiché AppBarLayout rimane incorporato nel corpo di DrawerLayout. Quindi la migliore pratica sarebbe quella di ridichiarne il layout. Se NavigationView è identico per tutti i frammenti, puoi scriverlo in un file di layout xml separato e utilizzare che può accorciare il tuo codice. –

+0

Bene, grazie! Penso solo che questa soluzione possa impiegare molto tempo nella commutazione dei frammenti. Ma lo userò. –

5

Non sono sicuro se il mio approccio è buono, ma ho cercato di aggiungere questo metodo pubblico alla mia attività:

public void setToolbar(Toolbar toolbar) { 
    if(toolbar != null) { 
     setSupportActionBar(toolbar); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
       this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 
    } else { 
     drawer.setDrawerListener(null); 
    } 
} 

e ho aggiunto questo in tutti i frammenti:

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    ((MainActivity)getActivity()).setToolbar(toolbar); 
} 

@Override 
public void onDestroyView() { 
    ((MainActivity)getActivity()).setToolbar(null); 
    super.onDestroyView(); 
} 

Sta funzionando benissimo, ma non sono sicuro che ciò possa causare perdite di memoria o altri problemi di prestazioni. Forse qualcuno può aiutarci?

+0

Ho risolto questo problema. Uso solo 'DrawerLayout' nel layout delle attività e' Toolbar' nei layout dei frammenti, dove in 'onCreateView' abbiamo impostato' Toolbar' come 'ActionBar' e lo sincronizzo con' DrawerLayout'. –

+0

E la tua soluzione non ha perdite di memoria) –

+1

@ Шах Ti piacerebbe approfondire come stai sincronizzando con 'DrawerLayout' dal frammento' onCreateView'? Stai ricreando il 'ActionBarDrawerToggle' per ogni frammento' Toolbar'? Stai usando il costruttore 'DrawerLayout' con, o senza,' Toolbar'? – jayeffkay

1

È possibile accedere principale DrawerLayout da ogni Fragment proprio come il seguente codice:

AppCompatActivity actionBar = (AppCompatActivity) getActivity(); 
    actionBar.setSupportActionBar(toolbar); 

    DrawerLayout drawer = (DrawerLayout) actionBar.findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      getActivity(), drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 
+0

Puoi descrivere un'attività e frammenti? Tutti i frammenti hanno le loro barre degli strumenti o usano le attività? Ho un'attività con DrawerLayout e NavigationView, al suo interno sono posizionati i frammenti, contengono CoordinatorLayout, AppBarLayout, Toolbar, ma funziona male, le barre degli strumenti non hanno l'aspetto che voglio quando cambiano i frammenti. – CoolMind

0

Se si desidera utilizzare appbar (barra degli strumenti) che si è specificato nel riquadro di navigazione a diversi frammenti con, ad esempio diverso menu delle opzioni elementi, è possibile creare un metodo pubblico in Attività principale in cui è stata specificata la logica del cassetto di navigazione.

public void setToolbar(Toolbar toolbar, String title){ 
    AppCompatActivity actionBar = this; 
    actionBar.setSupportActionBar(toolbar); 

    DrawerLayout drawer = (DrawerLayout)actionBar.findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toogle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.drawer_open, R.string.drawer_close); 
    drawer.addDrawerListener(toogle); 
    toogle.setDrawerIndicatorEnabled(true); 
    toogle.syncState(); 
    if(toolbar != null) 
     toolbar.setTitle(title); 
} 

Ora è possibile utilizzare questo metodo nei tuoi frammenti di accedere alla barra degli strumenti principale e sovrascrivere con il vostro titolo personalizzato, il menu opzioni ... È possibile farlo attraverso la creazione di una nuova variabile toolbar nel vostro frammento e poi gonfiare in modo onCreateView come questo

toolbarFragment = (Toolbar)getActivity().findViewById(R.id.toolbar); 

R.id.toolbar è l'id di una barra degli strumenti che si è specificato nel file di layout, ed è lo stesso ID utilizzato nella vostra attività principale per la barra degli strumenti principale. Ora è possibile chiamare il metodo setToolbar (barra degli strumenti barra degli strumenti, String titolo) nel frammento come questo

((MainActivity)getActivity()).setToolbar(toolbarFragment, "Some title"); 

Se si desidera utilizzare menu delle opzioni per questo frammento è necessario chiamare

setHasOptionsMenu(true); 

in frammenti onCreate() o metodi onCreateView(). Dopo di che è possibile ignorare il metodo onCreateOptionsMenu() come questo

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

È possibile ripetere questa procedura per altri frammenti nel cassetto di navigazione pure. Anche se ha funzionato per me, non so se questo viola le attività o frammenta il ciclo di vita o causa porri di memoria.

+0

No-no, ragazzo, non era un problema. Avevo bisogno di creare una GUI molto flessibile e complessa per diversi frammenti. Richiedeva l'accesso completo alla appbar –

+0

Solo io avevo frammenti con intestazione di parallasse, percorso di navigazione (come in alcuni file manager) ed ecc. –