Установить изначально выбранный элемент индекса / идентификатора в BottomNavigationView

Возможно, вы сможете сделать это с помощью xpath. что-то вроде //tr[contains(@class, 'row') and position() mod 2 = 0] может работать. Существуют другие вопросы SO, расширяющие подробности о том, как более точно сопоставлять классы.

29
задан Delacrix Morgan 24 April 2019 в 07:45
поделиться

10 ответов

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

bottomNavigationView.setSelectedItemId(R.id.item_id);

Этот метод стал доступен из библиотеки поддержки Android 25.3.0.

33
ответ дан user5968678 24 April 2019 в 07:45
поделиться

Хватит использовать 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();
}

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

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

1
ответ дан Filipe Brito 24 April 2019 в 07:45
поделиться

Вы можете расширить 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);
    }

}
0
ответ дан cpienovi 24 April 2019 в 07:45
поделиться

Реализуйте 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
0
ответ дан Delacrix Morgan 24 April 2019 в 07:45
поделиться

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

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

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

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

Также я могу порекомендовать позвонить .callOnClick() вместо .performClick() .

6
ответ дан Community 24 April 2019 в 07:45
поделиться

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

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

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

UPD:

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

bottomNavigationView.setSelectedItemId(R.id.item_id);

, так что используйте вместо:)

48
ответ дан UneXp 24 April 2019 в 07:45
поделиться

Код Котлина для начального выбранного элемента в bottomnavigation. Вид снизу:

1
ответ дан Hamed Jaliliani 24 April 2019 в 07:45
поделиться

Если вы используете слушатель, как и реализация по умолчанию в Android Studio, попробуйте это:

BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
Integer indexItem = 4;
navigation.getMenu().getItem(indexItem).setChecked(true);
mOnNavigationItemSelectedListener.onNavigationItemSelected(navigation.getMenu().getItem(indexItem));
3
ответ дан gugapc 24 April 2019 в 07:45
поделиться

Я считаю, что вопрос в этом контексте рассматривается в разных контекстах на основе ответов здесь. Согласно оценке, требуется умение сосредоточиться на конкретном предмете BottomNavigationView (определенно в новом классе, содержащем разные фрагменты).

Теперь у вас могут быть кнопки BottomNavigationView OR или Anything, нажимаемые для запуска нового действия по назначению: - т.е.

Intent intent = new Intent(getActivity(), New_Activity.class);
    intent.putExtra("EXTRA_PAGE, 1);
    startActivityForResult(intent, 30);

Затем - в нашей New_Activity, мы получаем намерение-

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

2
ответ дан Mbanda 24 April 2019 в 07:45
поделиться

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

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

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

17
ответ дан Jan Slominski 24 April 2019 в 07:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: