Я использую новинку android.support.design.widget.BottomNavigationView
из библиотеки поддержки. Как я могу установить текущий выбор из кода? Я понял, что после поворота экрана выбор снова меняется на первый элемент. Конечно, также было бы полезно, если бы кто-нибудь мог сказать мне, как «сохранить» текущее состояние BottomNavigationView
в onPause
функции и как восстановить его в onResume
.
Спасибо!
BottomNavigationView
не выполняет никакого внутреннего сохранения состояния. Вероятно, ожидайте, что это будет включено в будущее обновление. Дубликат (с дополнительной информацией) здесь: stackoverflow.com/questions/40236786/…Ответы:
В API 25.3.0 был представлен метод,
setSelectedItemId(int id)
позволяющий пометить элемент как выбранный, как если бы он был нажат.Из документов:
Пример кода:
ВАЖНЫЙ
Вы ДОЛЖНЫ уже добавить все элементы в меню (если вы делаете это программно) и установить Listener перед вызовом setSelectedItemId (я считаю, что вы хотите, чтобы код в вашем слушателе запускался, когда вы вызываете этот метод). Если вы вызовете setSelectedItemId перед добавлением пунктов меню и установкой слушателя, ничего не произойдет.
источник
onTabSelected
очевидно, ничего не будет. Прочтите документацию -> Установите идентификатор выбранного пункта меню. Это ведет себя так же, как нажатие на элемент. Это от разработчиков AndroidЧтобы программно щелкнуть элемент BottomNavigationBar, который вам нужен:
Это правильно расположит все предметы с их этикетками.
источник
Для тех, кто все еще пользуется SupportLibrary <25.3.0
Я не уверен, является ли это полным ответом на этот вопрос, но моя проблема была очень похожей - мне пришлось обработать
back
нажатие кнопки и перевести пользователя на предыдущую вкладку, где он был. Так что, может, мое решение кому-нибудь пригодится:Пожалуйста, имейте в виду, что если пользователь нажмет другую вкладку навигации
BottomNavigationView
, не очистит текущий выбранный элемент, поэтому вам необходимо вызвать этот методonNavigationItemSelected
после обработки действия навигации:Что касается сохранения состояния экземпляра, я думаю, вы могли бы поиграть с тем же
action id
видом навигации и найти подходящее решение.источник
Menu menu = bottomNavigationView.getMenu();
возвращает копию меню, чтобыbottomNavigationView
объект не пострадал?где
action_item1
ID пункта меню.источник
источник
Начиная с версии 25.3.0 теперь можно вызывать
setSelectedItemId()
\ o /источник
Добавить
android:enabled="true"
в элементы BottomNavigationMenu.А затем установите
bottomNavigationView.setOnNavigationItemSelectedListener(mListener)
и установите его как выбранное, выполнивbottomNavigationView.selectedItemId = R.id.your_menu_id
источник
Вероятно, это будет добавлено в следующих обновлениях. Но пока для этого вы можете использовать отражение.
Создайте собственное представление, расширяющееся от BottomNavigationView, и получите доступ к некоторым из его полей.
А затем используйте его в своем XML-файле макета.
источник
Просто добавьте еще один способ программно выполнить выбор - вероятно, это было изначально задумано или, может быть, это было добавлено позже.
performIdentifierAction
ПринимаетMenu
идентификатор товара и флаг.См. Документацию для получения дополнительной информации.
источник
Кажется, исправлено в SupportLibrary 25.1.0 :) Редактировать: Кажется, исправлено, что состояние выделения сохраняется при повороте экрана.
источник
Выше API 25 вы можете использовать setSelectedItemId (menu_item_id), но в API 25 вы должны сделать по-другому, пользовательское меню для получения дескриптора, а затем setChecked для отмеченного конкретного элемента
источник
Используйте это, чтобы установить выбранный элемент нижнего меню навигации по идентификатору меню
источник
Я не хочу изменять свой код. Если да, то я рекомендую вам попробовать BottomNavigationViewEx。
Вам просто нужно заменить вызов метода
setCurrentItem(index);
иgetCurrentItem()
。источник
использование
источник
Я сообщил Google о том, что нет надежного способа выбрать страницу в BottomNavigationView: https://code.google.com/p/android/issues/detail?id=233697
У NavigationView, по-видимому, была аналогичная проблема, которую они исправили, добавив новый метод setCheckedItem ().
источник
Вы можете попробовать метод performClick:
источник
Единственный «минус» решения - это использование
MenuItemImpl
, которое является «внутренним» для библиотеки (хотя и общедоступным).источник
ЕСЛИ ВАМ НУЖНО ДИНАМИЧЕСКИ ПЕРЕДАТЬ ФРАГМЕНТНЫЕ АРГУМЕНТЫ, СДЕЛАЙТЕ ЭТО
Здесь есть множество (в основном повторяющихся или устаревших) ответов, но ни один из них не обрабатывает очень распространенную потребность: динамическую передачу различных аргументов фрагменту, загруженному во вкладку .
Вы не можете динамически передавать различные аргументы загруженному фрагменту с помощью using
setSelectedItemId(R.id.second_tab)
, что приводит к вызову staticOnNavigationItemSelectedListener
. Чтобы преодолеть это ограничение, я сделал это в моем,MainActivity
который содержит вкладки:ArticleFragment.newInstance()
Метод реализован как обычно:источник
надеюсь, это поможет
Это больше похоже на определение фрагмента по умолчанию, загружаемого одновременно с соответствующим нижним пунктом меню навигации. Вы можете включить то же самое в обратные вызовы OnResume
источник
Этот метод работает для меня.
источник
Отражение - плохая идея.
Перейдите к этой сути . Есть метод, который выполняет выбор, но также вызывает обратный вызов:
источник
callOnClick()
вместоperformClick()
этого, мне не нужно отключать звук, который все равно не работалperformClick()
.