Переключение между Android навигация ящик изображение и курсор при использовании фрагментов
При использовании навигации на Андроид разработчики рекомендуют в ActionBar "и только те экраны, которые представлены в навигационной ящик, должны иметь меню навигации изображения" и что "все остальные экраны имеют традиционное до карата.&и"
Смотрите здесь для деталей: http://youtu.be/F5COhlbpIbY
Я'м, используя одно действие для управления несколькими уровнями фрагментов и может получить изображение навигации ящика для отображения и функции на всех уровнях.
При создании Нижнего фрагмента уровне я могу назвать ActionBarDrawerToggle
setDrawerIndicatorEnabled(ложные)
, чтобы скрыть изображение навигации ящик и до каре отображается
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 на верхней фрагменты уровне, чтобы повторно отобразить изображение навигации ящик?
<ч> <Н2>решение</Н2> Тома'предложением работал для меня. Вот что я сделал:
<Н3>в MainActivity</Н3> Эту деятельность контролирует все фрагменты в приложении.
При подготовке новых фрагментов заменить другим, я setDrawerIndicatorEnabled в DrawerToggle (нет)
, как это:
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(правда)` такой:
@Override
public void onBackPressed() {
super.onBackPressed();
// turn on the Navigation Drawer image;
// this is called in the LowerLevelFragments
setDrawerIndicatorEnabled(true)
}
<ч>
<Н3>в LowerLevelFragments</Н3>
В осколки я изменил метод
и будет onoptionsitemselected
такой:
В методе onCreateдобавлено
setHasOptionsMenu(правда), чтобы включить настройки меню опции. Также Сеть setDisplayHomeAsUpEnabled(true), то для включения <б><</б> в ActionBar:
@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;
…
}
Это's легко, как 1-2-3.
Если вы хотите достичь:
ящик индикатора - при отсутствии фрагментов в задней стеке или ящик открыт
Стрела - когда некоторые фрагменты в резервную стопку
П. С. см. [создаем панель навигации на Android] разработчики1 по другим советы по поводу 3-индикаторные линии поведения.
Вы написали, что для реализации нижнего уровня фрагментов, вы заменяете существующий фрагмент, в отличие от исполнителей более низкого уровня фрагмент в новый вид деятельности.
Я думаю, что тогда вам придется реализующими функции вручную: когда пользователь нажал назад у вас есть код, который берет стек (например, в
деятельность::переопределить onBackPressed
). Поэтому, где бы вы сделаете это, вы можете изменитьsetDrawerIndicatorEnabled
.Я'вэ используется следующая вещь:
Если кнопка на панели действий не't работа, Дон'т забудьте добавить слушателя :
Я'ве получил некоторые проблемы реализации ящике навигации с кнопку Home, все работало, за исключением бутон действий.
Попробовать регулировать подбор домашнего пункта в класс MainActivity в зависимости от состояния DrawerToggle. Таким образом, вы Дон'т иметь, чтобы добавить тот же код для каждого фрагмента.
ПОСЛЕДУЮЩИЕ
Решение дано @dzeikei аккуратно, но он может быть продлен, при использовании фрагментов, автоматически отбрасывая показатель ящик, когда backstack пуст.
Редактировать
На вопрос @JJD.
Фрагменты проводятся/управляемые в действии. Приведенный выше код пишется один раз в этой деятельности, но ручка только до каре для
будет onoptionsitemselected
.В одном из моих приложений, мне нужно, чтобы справиться с поведением до каре, когда кнопки "назад" была нажата. Это может быть ручка, переопределив
onBackPressed
.Обратите внимание на дублирование кода между
будет onoptionsitemselected
иonBackPressed
, который можно избежать путем создания метода и вызов этого метода в обоих местах.Также обратите внимание, я добавляю еще два раза
executePendingTransactions
что в моем случае было необходимо, иначе у меня иногда странное поведение до каре.Этот ответ работает, но есть небольшая проблема с ним. В
getSupportActionBar().setDisplayHomeAsUpEnabled(ложные) не вызывается явно, и это вызывает значок лотка, чтобы быть скрыты, даже если не было никаких предметов в backstack поэтому изменение
setActionBarArrowDependingOnFragmentsbackstack (метод)` работал для меня.Я создал интерфейс для таких действия, чтобы обновить представление состояния меню гамбургер. Для верхней фрагменты уровень я поставил тумблер
true
и фрагментов, по которым я хочу, чтобы отобразить вверх < стрелка я поставил тумблер на "false".Затем в моей деятельности ...
Если вы взгляните на Gmail приложения и приходят сюда для поиска Каррет/допустимого значок..
Я бы попросил вас сделать это, ни один из вышеперечисленных ответ был ясен. я был в состоянии изменить принятый ответ.
NavigationDrawer --> элемент ListView содержит subfragments.
subfragments будут перечислены, как это
firstFragment == позиция 0 ---> это будет иметь subfragments --> фрагмент
secondFragment
thirdFragment и так далее....
В firstFragment у вас есть другой фрагмент.
Называют это по DrawerActivity
и в фрагмент
На OnBackPressed метод активности ящика комплект ящика переключить в значение true, чтобы снова включить значок списка навигации.
Спасибо, Pusp
Логика понятна. Показать кнопку назад, если задняя стека фрагмента ясна. Показать материал гамбургер-задняя анимации, если стек фрагмент не понятно.
Вы можете посмотреть на этом маленьком примере! https://github.com/oskarko/NavDrawerExample
ИМО, используя onNavigateUp() (как показано здесь) в riwnodennyk's или Тома'ный раствор чище и, кажется, работает лучше. Просто замените код будет onoptionsitemselected с этим: