Подтвердить что ты не робот

Как программно добавить элемент подменю в новую библиотеку поддержки 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, но новые - нет. Любые идеи, как это сделать?

4b9b3361

Ответ 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>