Search code examples
androidnavigationview

Dynamic Menus in NavigationView


I have this Layout:

<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"/>

So, looking that in NavigationView we have the attribute:

  app:menu="@menu/drawer_menu"

And I have this XML id menu folder.

I wanna make dynamic menus, ie, in code I should mount the 'MenuItem' objects and set into NavigationView.

Is this correct? Is this best pratice? Is this possible?

Note: My code is working with 'static drawer_menu', I want to improve it.

I'm waiting.

[EDIT]

I make it:

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

But this error happened:

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 is a POJO with my menu data. In kmi.id I informed incremental integers...

I'm waitning


Solution

  • Seems like kmi.getId() returns int(or long).

    But Menu.add(int) adds menu with title from the given string resources, which is usually represented as R.string.something, and not for usual integer values.

    Menu.add(CharSequence) does add menu with title of CharSequence, so you need to do some int-to-string conversion like menu.add(kmi.getId() + "");