Как динамически скрывать пункт меню в BottomNavigationView?

Я хочу скрыть элемент меню BottomNavigationView динамически, основываясь на некоторых условиях. Я попробовал следующее, но он не работает.

mBottomNavigationView.getMenu()
            .findItem(R.id.item_name)
            .setVisible(false);

mBottomNavigationView.invalidate();

Ответы

Ответ 1

mBottomNavigationView.getMenu().removeItem(R.id.item_name);

removeItem делает трюк. Не знаю, почему метод setVisible не работает.

Ответ 2

Я пробовал большинство решений, но это сработало для меня,

Для скрытия элемента динамически: bottomNavigationView.findViewById(R.id.xyz).setVisibility(View.GONE);

Для видимости элемента: bottomNavigationView.findViewById(R.id.xyz).setVisibility(View.VISIBLE);

Ответ 3

RemoveItem перемещает элементы меню в панели, когда элемент скрыт. Я нашел несколько лучший способ. Создайте группу элементов меню, которые вы хотите скрыть свое xml-меню.

В вашем файле bottom_menu.xml

<menu...>
    <group android:id="@+id/hiddenmenu">
        <item.../>
        <item.../>
    </group>
    <item.../>
</menu>

И в вашей деятельности.cs

Menu menu = mbottomNavigation.getMenu();  
menu.getMenu.setGroupEnabled(R.id.hiddenmenu, false);

Хотя, с этой настройкой, когда все элементы меню видны, проверенное состояние изменения пунктов меню выходит из строя. Также попытался программно добавить пункты меню в пустую группу, но группа перестала отвечать на GroupDisable...

Ответ 4

setVisibility должен работать для вас. К вашему сведению, ниже пример в котлине.

bottomNavigationView.menu.findItem(R.id.navigation_item_two).isVisible = true

Ответ 5

Вы можете скрыть пункт меню, установив isVisible как false с использованием предложенного свойства isVisible в Kotlin. Но это делает ваш пункт меню удаленным из BottomNavigationView на Android 9 в качестве моего наблюдения.

bottomNavigation.menu.findItem(R.id.menu_item).isVisible = false

Если вы используете один цвет для нижнего фона навигации, вы можете использовать аналогичный подход для сохранения элементов меню на месте. Как пример тот, который в правом краю.

// 0x000000 is black as an example
bottomNavigation.menu.findItem(R.id.menu_item).icon = ColorDrawable(0x000000)
// and disable for the actions
bottomNavigation.menu.findItem(R.id.menu_item).isEnabled = false

Ответ 6

В моем случае я хотел скрыть текст панели инструментов и значки/заголовки элементов BottomNavigationView в фрагменте авторизации, который обрабатывает первоначальную загрузку моего приложения. Когда он определяет, что пользователь аутентифицирован и получает свой профиль из базы данных, я загружаю фрагмент фида, который извлекает данные из базы данных и отображает их пользователю. То, что я сделал, это добавить следующий метод для операции, которая создает элементы макета и вызывать его из его фрагментов, передавая логическое значение для определения видимости элементов.

public void setBottomNavigationViewItemsVisibility(boolean value) {
    if (this.bottomNavigationView != null) {
        this.bottomNavigationView.setVisibility(View.VISIBLE);
        Menu menu = this.bottomNavigationView.getMenu();
        if (value) {
            int[] icons = {R.drawable.ic_event_white_24dp, R.drawable.ic_explore,
                    R.drawable.ic_store_white_24dp, R.drawable.ic_notifications_white_24dp};
            int[] titles = {R.string.feed, R.string.explore, R.string.finder, R.string.notifications};
            for (int i = 0; i < menu.size(); i++) {
                menu.getItem(i).setIcon(icons[i]);
                menu.getItem(i).setTitle(titles[i]);
                menu.getItem(i).setEnabled(true);
            }
        } else {
            for (int i = 0; i < menu.size(); i++) {
                menu.getItem(i).setIcon(R.drawable.ic_empty);
                menu.getItem(i).setTitle(R.string.title_empty);
                menu.getItem(i).setEnabled(false);
            }
        }
    }
}

Мы объявляем массив доступных идентификаторов и массив идентификаторов заголовков в соответствии с тем, что мы объявили в файле XML меню. Если это правда, мы перебираем элементы меню и устанавливаем их значки, заголовок и их состояние по умолчанию. Если false, мы устанавливаем значок на прозрачный значок (удаление значка влияет на его размер), установите заголовок панели инструментов на пустую строку и отключите ее.

Меню BottomNavigationView:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/bottom_navigation_view_home">

    <item
        android:id="@+id/action_feed"
        android:enabled="true"
        android:icon="@drawable/ic_event_white_24dp"
        android:title="@string/feed"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_explore"
        android:enabled="true"
        android:icon="@drawable/ic_explore"
        android:title="@string/explore"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_finder"
        android:enabled="true"
        android:icon="@drawable/ic_store_white_24dp"
        android:title="@string/finder"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_notifications"
        android:enabled="true"
        android:icon="@drawable/ic_notifications_white_24dp"
        android:title="@string/notifications"
        app:showAsAction="ifRoom" />
</menu>

Пустой значок (ic_empty.xml):

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="24.0"
    android:viewportWidth="24.0">
    <path
        android:fillColor="#00FFFFFF"
        android:pathData="M8" />
</vector>

Пустое название (title_empty):

<string name="title_empty" />

Ответ 7

Использование решения DEEPANKAN SATIJA У меня сработало bottomNavigationView.findViewById(R.id.xyz).setEnabled(false);

Ответ 8

У меня в kotlin это работает так:

bottomNavigationView.rootView.findViewById<View>(R.id.nav_nearestRestaurant).visibility = View.GONE

Но дело в том, что если вы щелкнете по другому элементу, скрытый элемент появится снова, потому что нижняя панель перезагрузит свой внешний вид, когда покажет вам активный элемент (поэтому, если в вашем меню XML, его видимый, появится снова видимым (я думаю, чтобы у меня так бывает))