При использовании Навигационного Ящика разработчики 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) не воссоздает значок при повторном вводе того же фрагмента. Просто оставьте это здесь, когда другие тоже натолкнутся на эту проблему.Ответы:
Вы написали, что для реализации фрагментов более низкого уровня вы заменяете существующий фрагмент в отличие от реализации фрагмента более низкого уровня в новом действии.
Я бы подумал, что тогда вам придется реализовать функцию возврата вручную: когда пользователь нажал назад, у вас есть код, который выталкивает стек (например, в
Activity::onBackPressed
переопределении). Таким образом, где бы вы ни делали это, вы можете обратить вспятьsetDrawerIndicatorEnabled
.источник
Это просто как 1-2-3.
Если вы хотите добиться:
1) Индикатор ящика - когда в заднем стеке нет фрагментов или открыт ящик
2) Стрелка - когда некоторые фрагменты находятся в заднем стеке
3) Оба индикатора действуют в соответствии со своей формой
PS См. Раздел « Создание навигационного ящика на Android-разработчике», где приведены другие советы о поведении трехстрочного индикатора.
источник
setActionBarArrowDependingOnFragmentsBackStack()
... какое длинное имя: PЯ использовал следующую вещь:
источник
drawerToggle.setToolbarNavigationClickListener(
этот слушатель вызывается при нажатии на стрелкуЕсли ваша кнопка панели действий не работает, не забудьте добавить слушателя:
У меня возникли проблемы с реализацией навигации по ящику с помощью кнопки «Домой», все работало, кроме кнопки действий.
источник
Попробуйте обработать выбор элемента Home в MainActivity в зависимости от состояния DrawerToggle. Таким образом, вам не нужно добавлять одинаковый код к каждому фрагменту.
источник
onBackPressed()
потому что хотел одинакового поведения для обоих.СЛЕДОВАТЬ ЗА
Решение, данное @dzeikei, является изящным, но оно может быть расширено при использовании фрагментов, чтобы автоматически обрабатывать возврат индикатора ящика, когда обратный стек пуст.
РЕДАКТИРОВАТЬ
По вопросу @JJD.
Фрагменты хранятся / управляются в действии. Приведенный выше код написан один раз в этом упражнении, но обрабатывает только верхний регистр для
onOptionsItemSelected
.В одном из моих приложений мне также нужно было управлять поведением каретки вверх при нажатии кнопки назад. Это может быть сделано путем переопределения
onBackPressed
.Обратите внимание на дублирование кода между
onOptionsItemSelected
иonBackPressed
которого можно избежать, создав метод и вызвав этот метод в обоих местах.Также обратите внимание, что я добавляю еще два раза,
executePendingTransactions
что в моем случае требовалось, иначе у меня иногда было странное поведение восходящей каретки.источник
mDrawerToggle
вNavigationDrawerFragment
классе. Для того, чтобы получить его работу мне нужно также переключать состояние кнопки дома / индикатора - смNavigationDrawerFragment#toggleDrawerIndicator
. Кроме того, я не уверен, что вам нужна первоначальная регистрацияonOptionsItemSelected
: я раскомментировал ее. - Упрощенный примерonOptionsItemSelected
. Это гарантирует, что Навигационный ящик все еще открывается в иерархии верхнего уровня. Тем не менее, я переместил код вNavigationDrawerFragment#onOptionsItemSelected
. Это помогает мне не подвергатьmDrawerToggle
кMainActivity
.Я создал интерфейс для активности хостинга, чтобы обновить состояние просмотра меню гамбургера. Для фрагментов верхнего уровня я установил переключатель на
true
и для фрагментов, для которых я хочу отобразить стрелку вверх <, на которую я установил переключательfalse
.Тогда в моей деятельности ...
источник
Этот ответ работал, но с ним была небольшая проблема. Он
getSupportActionBar().setDisplayHomeAsUpEnabled(false)
не был вызван явно, и это приводило к тому, что значок ящика скрывался, даже когда в backstack не было никаких элементов, поэтому изменениеsetActionBarArrowDependingOnFragmentsBackStack()
метода работало для меня.источник
Логика понятна. Показать кнопку возврата, если фрагмент стека назад очищен. Показать материал анимации гамбургера, если стек фрагментов не ясен.
источник
Если вы посмотрите на приложение GMAIL и зайдете сюда, чтобы найти значок «carret / уступка».
Я бы попросил вас сделать это, ни один из приведенных выше ответов не был ясен. я смог изменить принятый ответ.
NavigationDrawer -> Listview содержит подфрагменты.
подфрагменты будут перечислены так
firstFragment == позиция 0 ---> это будет иметь подфрагменты -> фрагмент
В первом фрагменте у вас есть другой фрагмент.
Позвоните на DrawerActivity
и во фрагменте
В методе действий OnBackPressed Drawer установите переключатель ящика в значение true, чтобы снова включить значок списка навигации.
Спасибо, Пусп
источник
Вы можете посмотреть на этот маленький пример! https://github.com/oskarko/NavDrawerExample
источник
IMO, использование onNavigateUp () (как показано здесь ) в решении riwnodennyk или Tom более чистое и, кажется, работает лучше. Просто замените код onOptionsItemSelected следующим:
источник