При использовании навигационного ящика разработчики Android рекомендуют, чтобы в ActionBar "только те экраны, которые представлены в навигационном ящике, должны иметь изображение навигационного ящика" и что "все остальные экраны имеют традиционный карат".
Подробнее см. здесь: http://youtu.be/F5COhlbpIbY
Я использую одно действие для управления несколькими уровнями фрагментов и могу получить изображение навигационного ящика для отображения и работы на всех уровнях.
При создании фрагментов более низкого уровня я могу вызвать ActionBarDrawerToggle
setDrawerIndicatorEnabled(false)
, чтобы скрыть изображение навигационного ящика, и отобразиться надпись "вверх"
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();
Проблема, с которой я сталкиваюсь, - это когда я перехожу назад к фрагментам верхнего уровня, которые показывается вверх по карат, вместо исходного изображения навигационного ящика. Любые предложения о том, как "обновить" ActionBar на фрагментах верхнего уровня, чтобы повторно отобразить изображение навигационного ящика?
Решение
Том предложил мне работать. Вот что я сделал:
MainActivity
Эта активность управляет всеми фрагментами в приложении.
При создании новых фрагментов для замены других я устанавливаю DrawerToggle setDrawerIndicatorEnabled(false)
следующим образом:
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();
Далее, в переопределении onBackPressed
, я вернул выше, установив DrawerToggle на setDrawerIndicatorEnabled(true)
следующим образом:
@Override
public void onBackPressed() {
super.onBackPressed();
// turn on the Navigation Drawer image;
// this is called in the LowerLevelFragments
setDrawerIndicatorEnabled(true)
}
В LowerLevelFragments
В фрагментах я изменил onCreate
и onOptionsItemSelected
следующим образом:
В onCreate
добавлен setHasOptionsMenu(true)
, чтобы включить настройку меню опций. Также установите setDisplayHomeAsUpEnabled(true)
, чтобы включить < в панели действий:
@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);
}
Затем в onOptionsItemSelected
при нажатии < он вызывает onBackPressed()
из действия, чтобы перейти на один уровень в иерархии и отобразить изображение ящика навигации:
@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;
…
}