web-dev-qa-db-fra.com

Comment masquer de manière dynamique un élément de menu dans BottomNavigationView?

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();
17
Ram
mBottomNavigationView.getMenu().removeItem(R.id.item_name);

removeItem fait le tour. Vous ne savez pas pourquoi la méthode setVisible ne fonctionne pas.

38
Ram

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 ...

1
Bilal Kazi

setVisibility devrait fonctionner pour vous. Pour info, l'exemple ci-dessous est en kotlin.

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

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" />
0
Taylor Venissat