web-dev-qa-db-ja.com

NavigationViewの動的メニュー

私はこのレイアウトを持っています:

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

したがって、NavigationViewには次の属性があることがわかります。

  app:menu="@menu/drawer_menu"

そして、私はこのXML idメニューフォルダーを持っています。

動的なメニューを作成したいのですが、コードでは「MenuItem」オブジェクトをマウントしてNavigationViewに設定する必要があります。

これは正しいです?これは最高の練習ですか?これは可能ですか?

注:私のコードは「静的ドロワーメニュー」で動作しています。改善したいと思います。

私は待っています。

[編集]

私はそれを作ります:

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

しかし、このエラーが発生しました:

06-27 15:26:15.538 15335-15335 /? E/AndroidRuntime:致命的な例外:メインプロセス:com.example.sticdev30.newdrawer、PID:15335 Java.lang.RuntimeException:アクティビティを開始できませんComponentInfo {com.example.sticdev30.newdrawer/com.example.sticdev30.newdrawer.MainActivity }:Android.content.res.Resources $ NotFoundException:文字列リソースID#0x1

KSMenuItemは、メニューデータを含むPOJOです。 kmi.idで、増分整数を通知しました...

私は待っています

11

kmi.getId()int(またはlong)を返します。

ただし、 Menu.add(int) は、通常の整数値ではなく、通常_R.string.something_として表される、指定された文字列リソースからタイトル付きのメニューを追加します。

Menu.add(CharSequence) CharSequenceというタイトルのメニューを追加するため、menu.add(kmi.getId() + "");のようなintから文字列への変換を行う必要があります

1
WKBae

パブリックメソッドNavigationViewを使用して、2行のコードでinflateMenuを実行時に再膨張できます。この例では、new_navigation_drawer_items.xml

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

次の手順でメニューを動的に追加できます。

ステップ1。ナビゲーションビューからメニューオブジェクトを取得 NavigationView.getMenu()

ステップ2。 Menu.add() を使用してメニューにアイテムを追加します

11
Neeraj Kumar

メニュー項目を動的に追加/削除できます。このメニュー項目があると仮定します `

<group Android:checkableBehavior="single">
    <item
        Android:id="@+id/nav_home"
        Android:icon="@mipmap/home_icon_x48"
        Android:title="Home" />
    <item
        Android:id="@+id/nav_part_catalouge"
        Android:icon="@mipmap/catalogue_icon_x48"
        Android:title="Parts Catalogue" />
    <item
        Android:id="@+id/nav_favourite"
        Android:icon="@mipmap/my_favourate_x48"
        Android:title="My-Favourite" />\
    <item
        Android:id="@+id/nav_opencarrequest"
        Android:icon="@mipmap/cart_request"
        Android:title="Cart-Request" />

    <item
        Android:id="@+id/nav_setting"
        Android:icon="@mipmap/settings_x48"
        Android:title="Settings" />
</group>


<item Android:title="">
    <menu>
        <item
            Android:id="@+id/nav_logout"
            Android:icon="@mipmap/logout_icon_x48"
            Android:title="Logout" />
    </menu>
</item>

`

アクティビティでは、条件に基づいてメニュー項目を追加または削除できます

protected void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);// your activity layout here
   NavigationView navigationView= (NavigationView) findViewById(R.id.nav_view); // navigation view which holds menu items
   navigationView.setNavigationItemSelectedListener(this);
   if(yourCondition){
          navigationView.getMenu().getItem(0).setVisible(false); //if you want to hide first item
          navigationView.getMenu().getItem(1).setVisible(true); // if you want to show second menu item should be visible
  }


}

それがお役に立てば幸いです。

2
IMRA