Установите первоначально выбранный индекс / id объекта в BottomNavigationView

Я реализовал новый файл BottomNavigationView (com.android.support:design:25.0.0) и не знаю, как установить индекс выбора или идентификатор MenuItem (в моем случае по умолчанию должен быть выбран средний элемент). Боюсь, что пока нет такой возможности, пока она еще слишком сырая, но в любом случае любая помощь будет оценена. Благодаря!

Solutions Collecting From Web of "Установите первоначально выбранный индекс / id объекта в BottomNavigationView"

Установите выбранный идентификатор элемента меню с помощью setSelectedItemId :

 bottomNavigationView.setSelectedItemId(R.id.item_id); 

Этот метод стал доступен в Android Support Library 25.3.0.

Единственное решение, которое сработало для меня:

 View view = bottomNavigationView.findViewById(R.id.menu_action_dashboard); view.performClick(); 

Простое выполнение щелчка делает трюк. Надеюсь, у нас будут дополнительные методы / свойства в будущих выпусках.

UPD:

Как упоминалось user5968678 , новый метод был добавлен с Android Support Library v25.3.0:

 bottomNavigationView.setSelectedItemId(R.id.item_id); 

Поэтому используйте вместо этого 🙂

Я думаю, что это решение будет немного более элегантным, чем принятый ответ:

 bottomNavigationView.getMenu().getItem(menuItemIndex).setChecked(true) 

Где menuItemIndex – индекс выбранного элемента.

Вот что говорится в документации :

Элементы меню также могут использоваться для программного выбора того, какой пункт назначения в настоящий момент активен. Это можно сделать с помощью MenuItem#setChecked(true)

В качестве альтернативы тому, что Ян отправил, вы также можете найти элемент по id:

 Menu menu = findViewById(R.id.navigation).getMenu(); menu.findItem(R.id.navigation_home).setChecked(true); 

Кроме того, я могу рекомендовать вызывать .callOnClick() вместо .performClick() .

Прекратите использование Reflection! Это плохо!

Ну, в то время как библиотека поддержки не дает нам возможность выбрать элемент из BottomNavigationView, который будет отображаться в первый раз, когда он будет виден, у нас есть две возможности:

Во-первых, используя цикл:

 private void setupBottomNavigationView() { // Get the menu from our navigationBottomView. Menu bottomNavigationViewMenu = bottomNavigationView.getMenu(); // Uncheck the first menu item (the default item which is always checked by the support library is at position 0). bottomNavigationMenu.findItem(R.id.action_one).setChecked(false); // Check the wished first menu item to be shown to the user. bottomNavigationMenu.findItem(R.id.action_two).setChecked(true); bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { Menu bottomNavigationMenu = bottomNavigationView.getMenu(); for (int i = 0; i < bottomNavigationMenu.size(); i++) { if (item.getItemId() != bottomNavigationMenu.getItem(i).getItemId()) { bottomNavigationMenu.getItem(i).setChecked(false); } } switch (item.getItemId()) { case R.id.action_one : replaceFragment(new OneFragment()); break; case R.id.action_two : replaceFragment(new TwoFragment()); break; case R.id.action_three : replaceFragment(new ThreeFragment()); break; } return false; } }); } 

Во-вторых, без цикла, но с переменной класса (поскольку логика выполняется внутри внутреннего класса):

 private void setupBottomNavigationView() { // Get the menu from our navigationBottomView. Menu bottomNavigationViewMenu = bottomNavigationView.getMenu(); // Uncheck the first menu item (the default item which is always checked by the support library is at position 0). bottomNavigationViewMenu.findItem(R.id.action_one).setChecked(false); // Check the wished first menu item to be shown to the user. Also store that menu item on a variable to control when a menu item must be unchecked. mActiveBottomNavigationViewMenuItem = bottomNavigationViewMenu.findItem(R.id.action_two).setChecked(true); bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem selectedMenuItem) { switch (selectedMenuItem.getItemId()) { case R.id.action_one : replaceFragment(new OneFragment()); break; case R.id.action_two : replaceFragment(new TwoFragment()); break; case R.id.action_three : replaceFragment(new ThreeFragment()); break; } if (selectedMenuItem != mActiveBottomNavigationViewMenuItem){ mActiveBottomNavigationViewMenuItem.setChecked(false); mActiveBottomNavigationViewMenuItem = selectedMenuItem; } return false; } }); } private MenuItem mActiveBottomNavigationViewMenuItem; 

Когда выполняется метод setupBottomNavigationView ()? В методе Activity onCreate (), посмотрите:

 @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ... setupBottomNavigationView(); } 

Простой и без обширного кода.

Надеюсь, поможет!

Попробуйте этот код

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); bottomNavigationView.setOnNavigationItemSelectedListener(this); Menu menu = bottomNavigationView.getMenu(); this.onNavigationItemSelected(menu.findItem(R.id.action_favorites)); } 

Вы можете расширить метод BottomNavigationView и использовать рефлексию для вызова частных методов.

 public class SelectableBottomNavigationView extends BottomNavigationView { public SelectableBottomNavigationView(Context context) { super(context); } public SelectableBottomNavigationView(Context context, AttributeSet attrs) { super(context, attrs); } public SelectableBottomNavigationView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public void setSelected(int index) { try { BottomNavigationMenuView menuView = (BottomNavigationMenuView) getField(BottomNavigationView.class, "mMenuView"); OnNavigationItemSelectedListener listener = (OnNavigationItemSelectedListener) getField(BottomNavigationView.class, "mListener"); try { Method method = menuView.getClass().getDeclaredMethod("activateNewButton", Integer.TYPE); method.setAccessible(true); // activate item. method.invoke(menuView, index); if (listener != null) { // trigger item select event. listener.onNavigationItemSelected(getMenu().getItem(index)); } } catch (SecurityException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } private Object getField(Class clazz, String fieldName) throws NoSuchFieldException, IllegalAccessException { Field f = clazz.getDeclaredField(fieldName); f.setAccessible(true); return f.get(this); } }