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
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.
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?
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'. –
E la tua soluzione non ha perdite di memoria) –
@ Шах 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
È 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();
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
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.
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 –
Solo io avevo frammenti con intestazione di parallasse, percorso di navigazione (come in alcuni file manager) ed ecc. –
Questa è l'unica soluzione?Dovrò ricollegare quasi tutte le gerarchie di viste –
È 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. –
Bene, grazie! Penso solo che questa soluzione possa impiegare molto tempo nella commutazione dei frammenti. Ma lo userò. –