Menús dinámicos en NavigationView

Tengo este diseño:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- The ActionBar --> <include layout="@layout/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" /> <!-- The main content view --> <FrameLayout android:id="@+id/flContent" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> <!-- The navigation drawer --> <android.support.design.widget.NavigationView android:id="@+id/nvView" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:background="@android:color/white" app:menu="@menu/drawer_menu" app:headerLayout="@layout/nav_header"/> 

Por lo tanto, mirando que en NavigationView tenemos el atributo:

  app:menu="@menu/drawer_menu" 

Y tengo una carpeta de este menú de id de XML.

Quiero hacer dinamicament menús, es decir, en código debo montar los objetos 'MenuItem' y establecer en NavigationView .

¿Esto es correcto? ¿Cuál es la mejor práctica? ¿Esto es posible?

Nota: Mi código funciona con static drawer_menu , quiero mejorarlo.

Estoy esperando.

[EDITAR]

Yo lo hago:

  Menu menu = nvDrawer.getMenu(); for (KSMenuItem kmi : menus.values()) { if (menu.size() == 0) { menu.add(kmi.getId()); } if (menu.getItem(kmi.getId()) == null) { menu.add(kmi.getId()); } MenuItem mi = menu.getItem(kmi.getId()); mi.setIcon(kmi.getIcon()); mi.setTitle(kmi.getTittle()); } 

Pero este error ocurrió:

06-27 15:26:15.538 15335-15335/? E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.example.sticdev30.newdrawer, PID: 15335 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sticdev30.newdrawer/com.example.sticdev30.newdrawer.MainActivity}: android.content.res.Resources$NotFoundException: String resource ID #0x1

KSMenuItem es un POJO con mis datos de menú. En kmi.id informé enteros incrementales …

Estoy esperando

3 Solutions collect form web for “Menús dinámicos en NavigationView”

Parece que kmi.getId() devuelve int (o long ).

Pero Menu.add (int) agrega el menú con el título de los recursos de cadena dados, que normalmente se representa como R.string.something , y no para los valores enteros habituales.

Menu.add (CharSequence) agrega el menú con el título de CharSequence, así que necesitas hacer alguna conversión int-to-string como menu.add(kmi.getId() + "");

Puede volver a inflar NavigationView en tiempo de ejecución con 2 líneas de código mediante el método público inflateMenu . En este ejemplo, new_navigation_drawer_items.xml a inflar con new_navigation_drawer_items.xml

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

Puede agregar menús dinámicamente siguiendo los pasos siguientes:

Paso 1. Obtener el objeto de menú desde la vista de navegación NavigationView.getMenu ()

Paso 2. Agregue cualquier elemento al menú usando Menu.add ()

  • Efectos del acolchado negativo
  • NullPointerException que no apunta a ninguna línea en mi código
  • Uso de Javascript en la vista web
  • Android: ¿Proporciona sugerencias de búsqueda recientes sin actividad de búsqueda?
  • Cómo obtener la vista anterior o siguiente
  • GetActionView () de mi MenuItem return null
  • Error al inflar la vista de clase interna
  • ¿Puedo escalar una vista en Android?
  • GridLayout empuja a sus hijos y desbordamiento cuando se le da fill_parent para la altura
  • ¿Cómo usar la aleta de vista con tres diseños?
  • error: Sólo el subproceso original que creó una jerarquía de vista puede tocar sus vistas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.