如何以编程方式将子菜单项添加到新的 material 设计 android 支持库
How to programmatically add a submenu item to the new material design android support library
我正在尝试将新菜单项添加到新 Material 设计抽屉面板中的子菜单。
<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 月更新]
错误已解决。所以不用担心。
[以下内容已过时。]
向 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());
它目前是 hacky 解决方案。但是为我工作...
[更新 26-06-2015]
正如我在 Android 错误源报告这个错误现在错误被标记为 未来版本 ,这里是 link https://code.google.com/p/android/issues/detail?id=176300
所以我们可以说这个错误在未来的库中不再存在。所以你不必使用棘手的解决方案。当此错误的未来版本发布号维护时,我也会再次更新此答案。
您可以通过更改可见性在导航视图中添加和删除项目。获取索引处的项目并将其设置为 true 以显示,设置为 false 以隐藏它。
MenuItem item = navigationView.getMenu().getItem(3);
item.setVisible(false);
我找到了更改导航视图的更简单方法(同时使用子菜单和菜单)。您可以使用 2 行代码在运行时重新膨胀 NavigationView
。在此示例中,我使用 public 方法 inflateMenu
重新膨胀 new_navigation_drawer_items.xml
(您可以使用新子菜单创建菜单 xml 文件)
navigationView.getMenu().clear(); //clear old inflated items.
navigationView.inflateMenu(R.menu.new_navigation_drawer_items); //inflate new items.
使用此方法添加菜单和子菜单
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();
}
}
}
并在您设置抽屉内容的地方调用此方法。
这就是我在 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");
}
我正在尝试将新菜单项添加到新 Material 设计抽屉面板中的子菜单。
<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 月更新] 错误已解决。所以不用担心。
[以下内容已过时。]
向 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());
它目前是 hacky 解决方案。但是为我工作...
[更新 26-06-2015]
正如我在 Android 错误源报告这个错误现在错误被标记为 未来版本 ,这里是 link https://code.google.com/p/android/issues/detail?id=176300
所以我们可以说这个错误在未来的库中不再存在。所以你不必使用棘手的解决方案。当此错误的未来版本发布号维护时,我也会再次更新此答案。
您可以通过更改可见性在导航视图中添加和删除项目。获取索引处的项目并将其设置为 true 以显示,设置为 false 以隐藏它。
MenuItem item = navigationView.getMenu().getItem(3);
item.setVisible(false);
我找到了更改导航视图的更简单方法(同时使用子菜单和菜单)。您可以使用 2 行代码在运行时重新膨胀 NavigationView
。在此示例中,我使用 public 方法 inflateMenu
重新膨胀 new_navigation_drawer_items.xml
(您可以使用新子菜单创建菜单 xml 文件)
navigationView.getMenu().clear(); //clear old inflated items.
navigationView.inflateMenu(R.menu.new_navigation_drawer_items); //inflate new items.
使用此方法添加菜单和子菜单
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();
}
}
}
并在您设置抽屉内容的地方调用此方法。
这就是我在 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");
}