8

submenuプログラムで に項目を追加しようとしてNavigationViewいます。アイテムを追加できますが、追加できmenuませんsubmenu

メニュー作品への項目の追加

Menu menu = mNavigationView.getMenu();
menu.add(Menu.NONE, Menu.NONE, index, "Menu Item1");

ただし、サブメニューへのアイテムの追加は機能しません

Menu menu = mNavigationView.getMenu();
SubMenu subMenu = menu.addSubMenu("Sub menu title");
subMenu.add(Menu.NONE, Menu.NONE, index, "SubMenu Item1");
4

2 に答える 2

12

メニュー項目を含むBaseAdapter.notifyDataSetChanged基礎を呼び出すトリック。Adapterリフレクションを使用して、子を取得するか、子に到達するまでListViewループすることができます。NavigationView

Google がサポート ライブラリに最新の変更をプッシュしていないことを知っている限り、これは最新のコードではありませんが、基本的にNavigationMenuPresenter.prepareMenuItemsBaseAdpater.notifyDataSetChanged.

ただし、最新のソースを見たい場合は、SDK Manager からダウンロードできます。Android MNC のソースを選択します。次に、に移動します

yourAndroidSDK/sources/android-MNC/android/support/design/internal/NavigationMenuPresenter.java

ソース

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    final Menu menu = mNavigationView.getMenu();
    for (int i = 0; i < 4; i++) {
        menu.add("Menu Item " + (i + 1));
    }
    final SubMenu subMenu = menu.addSubMenu("SubMenu Title");
    for (int i = 0; i < 2; i++) {
        subMenu.add("SubMenu Item " + (i + 1));
    }
    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();
        }
    }

}

結果

結果

于 2015-06-03T02:58:50.507 に答える
1

誰かが、リフレクションとプライベート フィールドへのアクセスを介してそれを行う方法を考え出しました。きれいではありませんが、今のところ機能します。 https://stackoverflow.com/a/30604299/4232051

于 2015-06-03T02:24:50.370 に答える