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?
[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.
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);
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 NavigationView
at 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.
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");
}
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.