Как программно добавить элемент подменю в новую библиотеку поддержки 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, но новые - нет.
Любые идеи, как это сделать?
Ответы
Ответ 1
[Обновить 20-03-2016]
Ошибка решена. Так что не нужно беспокоиться.
[Этот ниже contutnt устарел.]
Добавление динамического меню в 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());
В настоящее время это хакерское решение. Но работайте для меня...
[обновить 26-06-2015]
Как я уже сообщал об этой ошибке в Android Bug source Теперь Bug отмечен как будущий выпуск, вот ссылка https://code.google.com/p/android/issues/detail?id=176300
Таким образом, мы можем сказать, что ошибка больше не существует в будущей библиотеке. Поэтому вам не нужно использовать сложное решение. Я также снова обновлю этот ответ, когда номер версии будущей версии будет основной для этой ошибки.
Ответ 2
Вы можете добавить и удалить элемент из режима навигации, изменив видимость. Получите элемент по индексу и setVisible в true, чтобы показать, и false, чтобы скрыть его.
MenuItem item = navigationView.getMenu().getItem(3);
item.setVisible(false);
Ответ 3
Я нашел более простой способ изменить навигационное представление (работа с подменю и меню). Вы можете повторно надуть NavigationView
во время выполнения с помощью двух строк кода. В этом примере я повторно надуваю 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.
Ответ 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();
}
}
}
и вызовите этот метод, когда вы настраиваете содержимое ящика.
Ответ 5
Вот как я управляю элементом подменю в 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>