Comment créer un simple séparateur dans la nouvelle NavigationView?

Google a introduit NavigationView dans la bibliothèque de support de conception 22.2.0 avec laquelle vous pouvez créer un tiroir très facilement en utilisant une ressource de menu.

Comment créer une ligne de séparation simple entre deux éléments? Le regroupement des éléments ne fonctionnait pas. La création d’une section de sous-éléments crée une ligne de séparation, mais elle nécessite un titre que je ne veux pas.

Toute aide serait appréciée.

    Tout ce que vous avez à faire est de définir un group avec un identifiant unique , j’ai vérifié l’implémentation si le groupe a des identifiants différents, cela créera un diviseur.

    Exemple de menu, création du séparateur:

             

    créer un draw_item_bg.xml pouvant être dessiné comme ceci,

                    

    et l’append à NavigationView en tant qu’application: itemBackground = “@ drawable / drawer_item_bg”

      

    et c’est parti … capture d’écran

    Ajout simple de DeviderItemDecoration:

     NavigationView navigationView = (NavigationView) findViewById(R.id.navigation); NavigationMenuView navMenuView = (NavigationMenuView) navigationView.getChildAt(0); navMenuView.addItemDecoration(new DividerItemDecoration(MainActivity.this,DividerItemDecoration.VERTICAL)); 

    Ça ressemble à ça:

    entrer la description de l'image ici

    Je pense que j’ai une solution encore meilleure pour le problème de plusieurs éléments cochés. À ma manière, vous n’avez pas à vous soucier de modifier votre code lorsque vous ajoutez de nouvelles sections à votre menu. Mon menu ressemble à la solution acceptée écrite par Jared, à la différence de l’utilisation de andoid: checkableBehavior = ” all ” sur les groupes:

               

    Le checkableBehavior de ‘all’ permet de cocher / décocher des éléments individuels à volonté, indépendamment du groupe auquel ils appartiennent. Il suffit de stocker le dernier menuitem vérifié. Le code Java ressemble à ceci:

     private MenuItem activeMenuItem; @Override public boolean onNavigationItemSelected(MenuItem menuItem) { // Update selected/deselected MenuItems if (activeMenuItem != null) activeMenuItem.setChecked(false); activeMenuItem = menuItem; menuItem.setChecked(true); drawerLayout.closeDrawers(); return true; } 

    Faire des groupes différents, comme la réponse de Nilesh, crée un séparateur. Mais crée le problème de deux éléments cochés dans le tiroir de navigation.

    Une façon simple de gérer cela était:

      public boolean onNavigationItemSelected(final MenuItem menuItem) { //if an item from extras group is clicked,refresh NAV_ITEMS_MAIN to remove previously checked item if (menuItem.getGroupId() == NAV_ITEMS_EXTRA) { navigationView.getMenu().setGroupCheckable(NAV_ITEMS_MAIN, false, true); navigationView.getMenu().setGroupCheckable(NAV_ITEMS_EXTRA, true, true); }else{ navigationView.getMenu().setGroupCheckable(NAV_ITEMS_MAIN, true, true); navigationView.getMenu().setGroupCheckable(NAV_ITEMS_EXTRA, false, true); } //Update highlighted item in the navigation menu menuItem.setChecked(true); } 

    Je voulais des séparateurs au-dessus du premier article et après le dernier article. En utilisant la solution @Nilesh, je devais append des éléments de menu factices et définir false sur false, ce qui était très sale. Et si je voulais faire d’autres choses intéressantes dans mon menu?

    J’ai remarqué que NavigationView étendait FrameLayout pour que vous puissiez y intégrer votre propre contenu, comme vous le feriez pour FrameLayout. J’ai ensuite défini un menu vide xml pour qu’il ne montre que ma mise en page personnalisée. Je comprends que cela va probablement à l’encontre du chemin que Google veut que nous prenions, mais si vous voulez un menu vraiment personnalisé, c’est un moyen facile de le faire.

                      

    Voici le style

      

    Et dessinable

          

    Et le menu

        

    modifier:

    Au lieu de boutons, vous pouvez utiliser TextView avec un dessin qui imite l’apparence des éléments de menu d’origine:

       // style.xml  

    Je ne sais pas si cela est corrigé dans l’ API 26 (Android 8) ou si c’était possible tout le temps. Je suis toujours un noob dans la programmation Android. Cependant, j’ai ajouté des groupes de parents comme ci-dessous. Test sur un téléphone physique Android 6,

    1. J’ai le diviseur
    2. La sélection de n’importe quel élément de nav_g1 ou nav_g2 désélectionnera d’autres éléments.
    3. Aucun remplissage supplémentaire ajouté en raison de groupes nesteds.
    4. Je n’ai ajouté aucun code Java aux auditeurs

    Code de menu

                        

    Remarques

    1. Comme mentionné dans cette réponse, chaque groupe doit avoir un identifiant unique pour montrer le diviseur.
    2. Selon cette réponse, les espaces correspondent aux spécifications de conception de Google.
    3. Avoir android:checkableBehavior="single" pour le groupe parent est nécessaire pour que le problème de plusieurs éléments de menu sélectionnés dans cette réponse (mentionné dans les commentaires de hungryghost) ne se produise pas

    Et voici la capture d’écran

    Capture d'écran de l'écran de l'appareil

    Vous pouvez facilement append des séparateurs en définissant l’arrière-plan de l’élément de menu via XML à l’aide de l’ app:itemBackground

      

    Et utilisez LayerDrawable comme arrière-plan. Il préserve la superposition des ondulations lors de la conception des matériaux.

                       

    Le résultat:

    entrer la description de l'image ici

    Le crédit devrait aller à Zorawar pour la solution, Désolé pour la duplication de la réponse mais n’a pas pu append autant de texte formaté dans un commentaire.

    La solution de Zorawar fonctionne, le code pourrait être amélioré en tant que tel:

     public void onNavigationItemSelected(int groupId) { //if an item from extras group is clicked,refresh NAV_ITEMS_MAIN to remove previously checked item navigationView.getMenu().setGroupCheckable(NAV_ITEMS_MAIN, (groupId == NAV_ITEMS_MAIN), true); navigationView.getMenu().setGroupCheckable(NAV_ITEMS_EXTRA, (groupId == NAV_ITEMS_EXTRA), true); //Update highlighted item in the navigation menu menuItem.setChecked(true); } 

    La réponse de Nileh a raison, sauf qu’il y a un défaut de double vérification.

              

    Donc en utilisant

    android: checkableBehavior = “single”

    avec identifiant unique doit résoudre le problème

    Si vous voulez append un diviseur dynamicment , vous pouvez simplement append un sous-menu vide comme ceci:

     Menu menu = navigationView.getMenu(); menu.addSubMenu(" ").add(" "); 

    Cela va append un diviseur.

    assurez-vous simplement de passer le bon index lorsque vous utilisez menu.getItem(int index)