web-dev-qa-db-fra.com

Comment ajouter par programme un élément de sous-menu à la nouvelle conception de matériel Android bibliothèque de support

J'essaie d'ajouter de nouveaux éléments de menu à un sous-menu du nouveau panneau de tiroir Material Design.

<Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context=".MainActivity">

...

    <Android.support.design.widget.NavigationView
        Android:id="@+id/main_navigation"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        app:headerLayout="@layout/channel_list_header"
        app:menu="@menu/menu_nav" /> 

</Android.support.v4.widget.DrawerLayout>

J'ai la configuration @ menu/menu_nav mais je souhaite maintenant ajouter de nouveaux éléments de menu:

NavigationView mDrawerList = (NavigationView) findViewById(R.id.main_navigation);

Menu menu = mDrawerList.getMenu();
Menu topChannelMenu = menu.addSubMenu("Top Channels");

topChannelMenu.add("Foo");
topChannelMenu.add("Bar");
topChannelMenu.add("Baz");

mDrawerList.invalidate(); // Trying to force a redraw, doesn't help.

Les éléments de menu du fichier @ menu/menu_nav sont affichés, mais les nouveaux ajoutés ne le sont pas. Des idées comment faire cela?

37
Moritur

[Mise à jour 20-03-2016] Le bogue est résolu. Donc pas besoin de s'inquiéter.

[Le contenu ci-dessous est obsolète.]

L'ajout d'un menu dynamique à NavigationView pose actuellement un bogue sur la bibliothèque Design Support . Et je dois le signaler à Android suivi de la source des bogues . Attendez donc que le bogue soit corrigé. Mais si vous le souhaitez la solution temporaire que vous pouvez le faire. Commencez par ajouter votre menu dynamique ..

    navView = (NavigationView) findViewById(R.id.navView);
    Menu m = navView.getMenu();
    SubMenu topChannelMenu = m.addSubMenu("Top Channels");
    topChannelMenu.add("Foo");
    topChannelMenu.add("Bar");
    topChannelMenu.add("Baz");

Après avoir ajouté votre menu, écrivez simplement le code ci-dessous.

    MenuItem mi = m.getItem(m.size()-1);
    mi.setTitle(mi.getTitle());

C'est actuellement la solution de hacky. Mais travaille pour moi ...

[mise à jour 26-06-2015]

Comme j'ai signalé ce bogue à l'adresse Android Source du bogue maintenant, bogue est marqué comme une version future , voici le lien. https://code.google.com/p/Android/issues/detail?id=1763

On peut donc dire que le bogue n’existe plus sur la future bibliothèque. Donc, vous n'avez pas à utiliser de solution délicate. Je mettrai également à jour cette réponse à nouveau lorsque le numéro de version de Future version sera maintenu pour ce bogue.

64
Moinkhan

Vous pouvez ajouter et supprimer un élément de la vue de navigation en modifiant la visibilité. Obtenez l'élément à index et définissezVisible sur true pour afficher et sur false pour le masquer.

MenuItem item = navigationView.getMenu().getItem(3);
item.setVisible(false);
19
vikoo

J'ai trouvé un moyen plus facile de changer l'affichage de la navigation (travailler avec les sous-menus et les menus). Vous pouvez regonfler NavigationViewat runtime avec 2 lignes de code. Dans cet exemple, je regonfle new_navigation_drawer_items.xml À l'aide de la méthode publique inflateMenu (vous pouvez créer un fichier xml de menu avec votre nouveau sous-menu)

navigationView.getMenu().clear(); //clear old inflated items.
navigationView.inflateMenu(R.menu.new_navigation_drawer_items); //inflate new items.
16
Nam Trung

Voici comment je manipule l'élément de sous-menu dans NavigationView

1) Créer un fichier menu.xml

<?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
  <group Android:checkableBehavior="single">
    <item Android:title="Index:" Android:id="@+id/mnugrp_Index">
      <menu>

        <!--This line below is dump line for rendering dynamic sub-menu item-->
        <item Android:icon="@drawable/ic_action_content_create" Android:title="Sub item 1" />

      </menu>
    </item>
  </group>

  <group Android:id="@+id/mnugrp_Attachment" Android:checkableBehavior="single">
    <item Android:title="Attachment:" Android:id="@+id/mnugrp_Attachment">
    <menu>
            
      <!--This line below is dump line for rendering dynamic sub-menu item-->
      <item Android:icon="@drawable/ic_action_content_create" Android:title="Sub item 1" />
    
    </menu>
  </item>
  </group>  
</menu>

2) Manipuler le menu en appelant cette fonction

        /// <summary>
    /// 
    /// </summary>
    /// <param name="navView"></param>
    private void AddNavigationMenuItem (NavigationView navView)
    {
        navView.Menu.FindItem(Resource.Id.mnugrp_Index).SubMenu.Clear();
        navView.Menu.FindItem(Resource.Id.mnugrp_Index).SubMenu.Add("This is Index 1");
        navView.Menu.FindItem(Resource.Id.mnugrp_Index).SubMenu.Add("This is Index 2");
        navView.Menu.FindItem(Resource.Id.mnugrp_Index).SubMenu.Add("This is Index 3");
        navView.Menu.FindItem(Resource.Id.mnugrp_Index).SubMenu.Add("This is Index 4");

        navView.Menu.FindItem(Resource.Id.mnugrp_Attachment).SubMenu.Clear();
        navView.Menu.FindItem(Resource.Id.mnugrp_Attachment).SubMenu.Add("This is Attachment 1");
        navView.Menu.FindItem(Resource.Id.mnugrp_Attachment).SubMenu.Add("This is Attachment 2");
        navView.Menu.FindItem(Resource.Id.mnugrp_Attachment).SubMenu.Add("This is Attachment 3");
        navView.Menu.FindItem(Resource.Id.mnugrp_Attachment).SubMenu.Add("This is Attachment 4");
    }

enter image description here

3
CodeSi

Utilisez cette méthode pour ajouter un menu et un sous-menu

private void addItemsRunTime(NavigationView navigationView) {

        //adding items run time
        final Menu menu = navigationView.getMenu();
        for (int i = 1; i <= 3; i++) {
            menu.add("Runtime item "+ i);
        }

        // adding a section and items into it
        final SubMenu subMenu = menu.addSubMenu("SubMenu Title");
        for (int i = 1; i <= 2; i++) {
            subMenu.add("SubMenu Item " + i);
        }

        // refreshing navigation drawer adapter
        for (int i = 0, count = mNavigationView.getChildCount(); i < count; i++) {
            final View child = mNavigationView.getChildAt(i);
            if (child != null && child instanceof ListView) {
                final ListView menuView = (ListView) child;
                final HeaderViewListAdapter adapter = (HeaderViewListAdapter) menuView.getAdapter();
                final BaseAdapter wrapped = (BaseAdapter) adapter.getWrappedAdapter();
                wrapped.notifyDataSetChanged();
            }
        }
    }

et appelez cette méthode pour configurer le contenu du tiroir.

3
Prashant Sharma