Ответ 1
Задайте выбранный идентификатор элемента меню с помощью setSelectedItemId
:
bottomNavigationView.setSelectedItemId(R.id.item_id);
Этот метод стал доступен в Android Support Library 25.3.0.
Я реализовал BottomNavigationView и не знаю, как установить индекс выбора или идентификатор MenuItem
(в моем случае средний элемент должен быть выбран по умолчанию).
Я боюсь, что пока такой возможности нет, поскольку она слишком сырая, но в любом случае любая помощь будет оценена. Спасибо!
Задайте выбранный идентификатор элемента меню с помощью 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()
.
Если вы используете слушатель, как по умолчанию в Android Studio, попробуйте это:
BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
Integer indexItem = 4;
navigation.getMenu().getItem(indexItem).setChecked(true);
mOnNavigationItemSelectedListener.onNavigationItemSelected(navigation.getMenu().getItem(indexItem));
Я считаю, что вопрос в этом контексте рассматривается в разных контекстах на основе ответов здесь. Согласно оценке, требуется умение сосредоточиться на конкретном BottomNavigationView
(определенно в новом классе, содержащем разные фрагменты).
Теперь у вас могут быть кнопки BottomNavigationView OR или Anything, которые можно нажимать для запуска нового действия по назначению: - т.е.
Intent intent = new Intent(getActivity(), New_Activity.class);
intent.putExtra("EXTRA_PAGE, 1);
startActivityForResult(intent, 30);
Затем -in наша New_Activity, мы получаем intent-
Intent intent = getIntent(); int page = intent.getExtras(). getInt ("EXTRA_PAGE);
Затем мы перебираем переменную страницы, чтобы найти число/индекс, для которого отражается текущий BottomNavigationView, затем мы устанавливаем наш элемент меню фокуса (при условии, что у вашего BottomNavigationView есть пункт меню для его отображения)
if(page == 1) {
currentselect = new Pending();
bottomNavigationView.getMenu().getItem(0).setChecked(true);
}
Это отвечает на вопрос выше. Оставшаяся часть фрагмента переключается хорошо по количеству сообщений выше, вызывая:
bottomNavigationView.setOnNavigationItemSelectedListener(navListener);
private BottomNavigationView.OnNavigationItemSelectedListener navListener =
new BottomNavigationView.OnNavigationItemSelectedListener(){
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Fragment selectedFrag = null;
switch (item.getItemId()) {
case R.id.pending:
selectedFrag = new Pending();
break;
case R.id.onTransmit:
selectedFrag = new inTransmit();
break;
case R.id.complete:
selectedFrag = new Complete();
break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.select_field, selectedFrag).commit();
return true;
}
};
ПРИМЕЧАНИЕ. Использование BottomNavigationView и ContentFrameLayout очень экономично и сократит ваш код до 50%, в отличие от использования подобных ViewPager и Tablayout.
Прекратить использование 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();
}
Простой и без расширенного кода.
Надеюсь, что это поможет!
Код Котлина для начального выбранного элемента в bottomnavigation.BottomNavigationView:
bottom_navigation_view.selectedItemId = R.id.navigation_item_messages
Вы можете расширить 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);
}
}
Попробуйте этот код
@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.OnNavigationItemSelectedListener
и установите selectedItemId
при инициализации.
this.bottomNavigationView.setOnNavigationItemSelectedListener {
val targetFragment = when (menuItem.itemId) {
R.id.action_home -> {
HomeFragment()
}
R.id.action_post -> {
PostFragment()
}
R.id.action_settings -> {
SettingsFragment()
}
else -> null
}
targetFragment?.let {
this.activity?.supportFragmentManager?.transaction {
replace(R.id.containerLayout, it, it.javaClass.simpleName)
}
}
true
}
this.bottomNavigationView.selectedItemId = R.id.action_home