Je souhaite masquer un élément de menu de BottomNavigationView de manière dynamique en fonction de certaines conditions. J'ai essayé ce qui suit mais cela ne fonctionne pas.
mBottomNavigationView.getMenu()
.findItem(R.id.item_name)
.setVisible(false);
mBottomNavigationView.invalidate();
mBottomNavigationView.getMenu().removeItem(R.id.item_name);
removeItem fait le tour. Vous ne savez pas pourquoi la méthode setVisible ne fonctionne pas.
RemoveItem déplace les éléments de menu dans la barre lorsqu'un élément est masqué. J'ai trouvé un moyen légèrement meilleur. Créez un groupe d’éléments de menu que vous souhaitez masquer.
Dans votre bottom_menu.xml
<menu...>
<group Android:id="@+id/hiddenmenu">
<item.../>
<item.../>
</group>
<item.../>
</menu>
Et dans votre activity.cs
Menu menu = mbottomNavigation.getMenu();
menu.getMenu.setGroupEnabled(R.id.hiddenmenu, false);
Cependant, avec cette configuration, lorsque tous les éléments de menu sont visibles, l'état de modification coché des éléments de menu devient incontrôlable. Nous avons également essayé d’ajouter par programme des éléments de menu à un groupe vide, mais le groupe ne répondait plus à GroupDisable ...
setVisibility devrait fonctionner pour vous. Pour info, l'exemple ci-dessous est en kotlin.
bottomNavigationView.menu.findItem(R.id.navigation_item_two).isVisible = true
Dans mon cas, je voulais masquer le texte de la barre d’outils et les icônes/titres des éléments BottomNavigationView dans le fragment d’autorisation, qui gère le chargement initial de mon application. Lorsqu'il détermine que l'utilisateur est authentifié et extrait son profil de la base de données, je charge le fragment de flux, qui extrait les données de la base de données et les affiche à l'utilisateur. Ce que j'ai fait a été d'ajouter la méthode suivante à l'activité qui crée les éléments de présentation et de l'appeler à partir de ses fragments, en passant un booléen pour déterminer la visibilité des éléments.
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);
}
}
}
}
Nous déclarons un tableau d'ID dessinés et un tableau d'ID de titres correspondant à ce que nous avons déclaré dans le fichier XML du menu. Si la valeur est true, nous parcourons les éléments de menu et définissons leur icône, leur titre et leur état sur les valeurs par défaut. Si la valeur est false, nous définissons l'icône sur une icône transparente (sa suppression affecte sa taille), définissons le titre de la barre d'outils sur une chaîne vide et le désactivons.
BottomNavigationView Menu:
<?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ône vide (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>
Titre vide (title_empty):
<string name="title_empty" />