Навигационный ящик - Как добавить элементы во время выполнения в существующую группу меню - PullRequest
0 голосов
/ 31 октября 2018

У меня есть эта существующая группа, названная group0, определенная в xml:

<group android:id="@+id/group0"
    android:checkableBehavior="single">
    <item
        android:id="@+id/nav_camera"
        android:icon="@drawable/ic_menu_camera"
        android:title="Import" />
    <item
        android:id="@+id/nav_gallery"
        android:icon="@drawable/ic_menu_gallery"
        android:title="Gallery" />
</group>

Я хочу добавить больше опций:

nav_view.menu.add(groupId = R.id.group0, itemId = 85621, order = 12345, title = "adding to group 0")

Несмотря на параметр targetGroup, это не добавляет к group0. Я могу подтвердить это, удалив все в group0:

nav_view.menu.removeGroup(R.id.group0)

Новый предмет не удален. Он также не разделяет checkableBehavior, определенный в XML.

Как программно добавить новые элементы в существующую группу?

1 Ответ

0 голосов
/ 31 октября 2018

После прочтения исходного кода Android, я думаю, у меня есть представление о проблемах здесь.

Новый элемент действительно был добавлен в group0 как рекламируется. Это можно проверить с помощью свойства groupId. Но он не ведет себя как один. Похоже, что это две отдельные проблемы, которые у меня были.

  1. Элемент не удаляется при удалении группы.

Оказывается, это неверная конфигурация и ошибка Android. В исходном коде метода removeGroup(int groupId) android начинает перебирать каждый пункт меню и проверяет его groupId. Но он прерывает процесс, если следующий элемент больше не принадлежит целевой группе. Это приемлемая оптимизация, предполагающая, что все элементы в одной группе будут отображаться рядом друг с другом в окне навигации. «Неверная конфигурация» заключается в том, что я передал большое целое число для order, в результате чего мой элемент появился намного позже в списке.

Решением здесь является передача 0 для параметра order при добавлении пункта меню, чтобы они отображались рядом с существующими элементами в группе. Также можно переопределить функцию removeGroup и удалить код «оптимизации».

  1. Элемент не разделяет checkableBehavior, определенный группой в XML.

Это потому, что isCheckable на самом деле является свойством для каждого пункта меню, а не свойством группы. Поэтому, когда добавляются новые элементы, они автоматически не устанавливают isCheckable правильно (хотя технически метод add в Android мог бы легко сделать это для нас).

Решением здесь является вызов isCheckable = true для каждого из вновь добавленных предметов.

...