web-dev-qa-db-ja.com

プログラムでサブマテリアルを新しいマテリアルデザインに追加する方法Androidサポートライブラリ

新しい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>

@ menu/menu_navのセットアップはありますが、新しいメニュー項目を追加したいです:

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.

@ menu/menu_navファイルのメニュー項目は表示されますが、新しく追加されたものは表示されません。それを行う方法はありますか?

37
Moritur

[2016年3月20日更新]バグは解決されました。心配する必要はありません。

[以下の内容は時代遅れです。]

NavigationViewへの動的メニューの追加は、現在デザインサポートライブラリのバグです。そして、Androidバグソーストラッキングに報告しています。バグが修正されるまでお待ちください。 一時的な解決策それを行うことができます。最初に動的メニューを追加します..

    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");

メニューを追加したら、以下のコードを書くだけです。

    MenuItem mi = m.getItem(m.size()-1);
    mi.setTitle(mi.getTitle());

これは現在、ハッキングされたソリューションです。しかし、私のために働く...

[2015年6月26日更新]

このバグをAndroid Bug source Nowで報告したので、バグはfuture releaseとしてマークされています。ここにリンクがあります https://code.google.com/p/Android/issues/detail?id=1763

したがって、バグは将来のライブラリにはもう存在しないと言えます。したがって、トリッキーなソリューションを使用する必要はありません。将来のバージョンのリリース番号がこのバグのメンテナンスになっている場合も、この回答を更新します。

64
Moinkhan

可視性を変更することにより、ナビゲーションビューでアイテムを追加および削除できます。インデックスでアイテムを取得し、setVisibleをtrueに設定して非表示にするにはfalseに設定します。

MenuItem item = navigationView.getMenu().getItem(3);
item.setVisible(false);
19
vikoo

ナビゲーションビューを変更する簡単な方法を見つけました(サブメニューとメニューの両方で動作します)。 2行のコードでNavigationViewatランタイムに再インフレートできます。この例では、new_navigation_drawer_items.xmlパブリックメソッドinflateMenuを使用(新しいサブメニューでメニューxmlファイルを作成できます)

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

これは、NavigationViewでサブメニュー項目を操作する方法です

1)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)この関数を呼び出してメニューを操作します

        /// <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");
    }

enter image description here

3
CodeSi

このメソッドを使用して、メニューとサブメニューを追加します

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

drawer Contentをセットアップする場所でこのメソッドを呼び出します。

3
Prashant Sharma