При использовании навигационного ящика разработчики 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();
Проблема, с которой я сталкиваюсь, заключается в том, что когда я возвращаюсь к фрагментам верхнего уровня, Up carat все еще показывает вместо исходного изображения ящика навигации. Есть ли предложения о том, как «обновить» ActionBar на фрагментах верхнего уровня, чтобы повторно отобразить изображение панели навигации?
Решение
Предложение Тома сработало для меня. Вот что я сделал:
Основная деятельность
Это действие контролирует все фрагменты в приложении.
При подготовке новых фрагментов для замены других я устанавливаю 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)
}
Фрагменты нижнего уровня
Во фрагментах я модифицировал 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;
…
}
.replace(R.id.frag_layout
. Если это еще один уровень иерархии, я ожидаю, что вы.add
перейдете на задний план. - person JJD   schedule 27.05.2014theDrawerToggle.setDrawerIndicatorEnabled(false);
внутри фрагмента? Я думаю, что это объявлено в файле класса Main Activity. Я не могу найти способ сослаться на это. Есть подсказки? - person Skynet   schedule 30.10.2014setDisplayOptions()
внутриToolbarWidgetWrapper
(внутреннего пакета android.support.v7.internal.widget) не воссоздает значок при повторном вводе того же фрагмента. Просто оставьте это здесь, когда другие тоже наткнутся на эту проблему. - person Wolfram Rittmeyer   schedule 03.03.2015