新しい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ファイルのメニュー項目は表示されますが、新しく追加されたものは表示されません。それを行う方法はありますか?
[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
したがって、バグは将来のライブラリにはもう存在しないと言えます。したがって、トリッキーなソリューションを使用する必要はありません。将来のバージョンのリリース番号がこのバグのメンテナンスになっている場合も、この回答を更新します。
可視性を変更することにより、ナビゲーションビューでアイテムを追加および削除できます。インデックスでアイテムを取得し、setVisibleをtrueに設定して非表示にするにはfalseに設定します。
MenuItem item = navigationView.getMenu().getItem(3);
item.setVisible(false);
ナビゲーションビューを変更する簡単な方法を見つけました(サブメニューとメニューの両方で動作します)。 2行のコードでNavigationView
atランタイムに再インフレートできます。この例では、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.
これは、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");
}
このメソッドを使用して、メニューとサブメニューを追加します
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をセットアップする場所でこのメソッドを呼び出します。