Динамический добавочный элемент в NavigationView на Android

Я хочу создать NavigationDrawer с возможностью добавления новых элементов (например, приложение Yahoo Weather с добавлением новых городов). Я работаю NavigationDrawer с NavigationView, в меню у меня есть постоянные поля:

   <group
        android:id="@+id/group"
        android:checkableBehavior="single">
        <item
            android:checked="false"
            android:id="@+id/item1"
            android:icon="@drawable/ic_inbox_black_24dp"
            android:title="Item1" />
        <item
            android:checked="false"
            android:id="@+id/Item2"
            android:icon="@drawable/ic_inbox_black_24dp"
            android:title="Item2"
            />
    </group>

Я пытаюсь добавить новый Item этот метод:

 public boolean addNewItem(String itemName){
        Menu menu = navigationView.getMenu();
        menu.add(R.id.group,Menu.NONE,Menu.NONE,itemName);
        return true;
 }

И я получаю не совсем то, что хочу: Результат

Есть ли у кого-нибудь идеи, как решить эту проблему? Или почему это происходит? Я не знаю, где и как можно хранить информацию о добавленных элементах. Есть идеи?

Ответ 1

Чтобы добавить Элемент программно, мы можем получить объект Меню, используя метод getMenu() из NavigationView, а затем мы можем добавить Элементы в навигационную панель, используя этот объект Menu.

final Menu menu = navigationView.getMenu();
for (int i = 1; i <= 3; i++) {
   menu.add("Runtime item "+ i);
}

Используя SubMenu, мы можем добавить подраздел и Предметы в него.

// 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);
}

для получения более подробной информации Проверьте TechnoTalkative.

ОБНОВЛЕНИЕ: Если вы хотите взаимодействовать с меню, используйте
menu.add(0, itemId, 0, title);, а затем

 public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

id даст вам назначенный itemId

Ответ 2

Предположим, что у вас есть две группы, group1 и group2. Если вы хотите динамически добавлять элементы в группу 1, вы можете назначить приоритет группе2, чтобы сделать ее всегда ниже group1. Затем, когда вы добавляете новые элементы в группу 1, он не будет вставлен ниже group2.

Вот пример:

<group android:id="@+id/group1" />
<group
    android:id="@+id/group2"
    android:orderInCategory="999">
    <item
        android:checked="false"
        android:id="@+id/item1"
        android:icon="@drawable/ic_inbox_black_24dp"
        android:title="Item1" />
    <item
        android:checked="false"
        android:id="@+id/Item2"
        android:icon="@drawable/ic_inbox_black_24dp"
        android:title="Item2"
        />
</group>

И когда вы добавляете пункты меню в группу 1:

Menu menu = navigationView.getMenu();
menu.add(R.id.group1,Menu.NONE,Menu.NONE,itemName);

Это должно сработать. Я тестировал его в библиотеке Android 23.1.1.

Ответ 3

<group android:checkableBehavior="single"> 
    <item
        android:id="@+id/send_notification"
        android:icon="@drawable/ic_menu_send"
        android:title="@string/send_notification"
        android:visible="false"/>     
</group>

если вы тоже хотите динамически добавить элемент в блок навигации, сделайте его невидимым в xml и сделайте его видимым с программной точки зрения следующим образом.

NavigationView navigationView = findViewById(R.id.nav_view);
Menu menu=navigationView.getMenu();
menu.findItem(R.id.send_notification).setVisible(true);

вот и все.