При использовании Навигационного Ящика разработчики 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();
Проблема, с которой я столкнулся, заключается в том, что, когда я возвращаюсь к фрагментам верхнего уровня, карат вверх все равно отображается вместо исходного изображения в Навигаторе. Любые предложения о том, как «обновить» панель действий на фрагментах верхнего уровня, чтобы повторно отобразить изображение «Ящика навигации»?
Решение
Предложение Тома сработало для меня. Вот что я сделал:
Основное занятие
Это действие контролирует все фрагменты в приложении.
При подготовке новых фрагментов для замены других я установил 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
вернетесь в прошлое.
theDrawerToggle.setDrawerIndicatorEnabled(false);
на фрагмент? Я думаю, что это объявлено в файле класса Main Activity. Я не могу найти способ ссылаться на это. Есть намеки?
setDisplayOptions()
метод внутри ToolbarWidgetWrapper
(из внутреннего пакета android.support.v7.internal.widget) не воссоздает значок при повторном вводе того же фрагмента. Просто оставьте это здесь, когда другие тоже натолкнутся на эту проблему.