Podczas korzystania z szuflady nawigacji programiści Androida zalecają, aby na pasku akcji „tylko te ekrany, które są reprezentowane w szufladzie nawigacji, miały faktycznie obraz szuflady nawigacji” oraz aby „wszystkie inne ekrany miały tradycyjny up-carat”.
Szczegółowe informacje można znaleźć tutaj: http://youtu.be/F5COhlbpIbY
Używam jednego działania do kontrolowania wielu poziomów fragmentów i mogę sprawić, by obraz szuflady nawigacji był wyświetlany i działał na wszystkich poziomach.
Podczas tworzenia fragmentów niższego poziomu mogę wywołać, ActionBarDrawerToggle
setDrawerIndicatorEnabled(false)
aby ukryć obraz szuflady nawigacji i wyświetlić kursor Up
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();
Problem, który mam, polega na tym, że przechodzę z powrotem do fragmentów najwyższego poziomu, które nadal pokazuje karat Up zamiast oryginalnego obrazu szuflady nawigacji. Jakieś sugestie, jak „odświeżyć” ActionBar we fragmentach najwyższego poziomu, aby ponownie wyświetlić obraz szuflady nawigacji?
Rozwiązanie
Sugestia Toma zadziałała dla mnie. Oto co zrobiłem:
Główna aktywność
Ta aktywność kontroluje wszystkie fragmenty w aplikacji.
Przygotowując nowe fragmenty do zastąpienia innych ustawiam DrawerToggle w setDrawerIndicatorEnabled(false)
następujący sposób:
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();
Następnie, zastępując onBackPressed
, cofnąłem powyższe, ustawiając DrawerToggle setDrawerIndicatorEnabled(true)
tak, aby :
@Override
public void onBackPressed() {
super.onBackPressed();
// turn on the Navigation Drawer image;
// this is called in the LowerLevelFragments
setDrawerIndicatorEnabled(true)
}
W LowerLevelFragments
We fragmentach zmodyfikowałem onCreate
i onOptionsItemSelected
tak:
W onCreate
dodany setHasOptionsMenu(true)
w celu umożliwienia konfiguracji menu opcji. Ustaw również, setDisplayHomeAsUpEnabled(true)
aby włączyć < na pasku akcji:
@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);
}
Następnie po onOptionsItemSelected
każdym naciśnięciu < wywołuje onBackPressed()
z działania, aby przejść o jeden poziom w górę w hierarchii i wyświetlić obraz szuflady nawigacji:
@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
. Jeśli jest to jeszcze jeden poziom hierarchii, spodziewałbym się, że zostaniesz .add
na zapleczu.
theDrawerToggle.setDrawerIndicatorEnabled(false);
wnętrza fragmentu? Myślę, że jest to zadeklarowane w pliku klasy Main Activity. Nie mogę znaleźć sposobu, żeby to odnieść. Jakieś wskazówki?
setDisplayOptions()
metoda wewnątrz ToolbarWidgetWrapper
(wewnętrznego pakietu android.support.v7.internal.widget) nie utworzyłaby ikony podczas ponownego wprowadzania tego samego fragmentu. Zostawiam to tutaj na wypadek, gdyby inni również napotkali ten problem.