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

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 ()

  • ¿Cómo puedo cerrar un SearchView mediante programación?
  • ¿Qué es exactamente un widget?
  • GetMeasuredWidth devuelve un valor totalmente erróneo
  • Gallery ImageAdapter convertView siempre es nulo
  • Retrasar la llamada a onQueryTextChange () en SearchView.OnQueryTextListener con SearchView
  • ¿Hay una mejor manera de restaurar el estado de SearchView?
  • El niño especificado ya tiene un padre
  • RemoteViews setLayoutParams?
  • Android findViewById () en la vista personalizada
  • Página Curl Animation en android?
  • Haciendo que un botón sea más fácil de hacer clic
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.