Как динамически скрыть пункт меню в BottomNavigationView?
Я хочу скрыть пункт меню bottomnavigationview динамически на основе некоторых условий. Я пробовал следующее, Но это не работает.
mBottomNavigationView.getMenu()
.findItem(R.id.item_name)
.setVisible(false);
mBottomNavigationView.invalidate();
5 ответов
mBottomNavigationView.getMenu().removeItem(R.id.item_name);
метод removeitem делает трюк. Не уверен, почему метод setVisible не работает.
Я пробовал большинство решений, но это сработало для меня,
для динамического скрытия элемента :
bottomNavigationView.findViewById(R.id.xyz).setVisibility(View.GONE);
для изготовления элемента видны:
bottomNavigationView.findViewById(R.id.xyz).setVisibility(View.VISIBLE);
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...
setVisibility должен работать для вас. FYI, ниже пример находится в Котлине.
bottomNavigationView.findViewById<BottomNavigationItemView(R.id.navigation_item2).visibility=View.GONE
в моем случае я хотел скрыть текст панели инструментов и значки / заголовки элементов 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);
}
}
}
}
мы объявляем массив выигрышного ID и массив идентификаторов название соответствует тому, что мы объявили в файле xml-меню. Если true, мы перебираем пункты меню и устанавливаем для их значков, заголовков и состояния значения по умолчанию. Если 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" />