Android中动态向NavigationView添加项目

22

我想构建一个具有添加新项目功能的NavigationDrawer(例如Yahoo天气应用程序可以添加新城市)。我已经有了带有NavigationView的工作NavigationDrawer,在菜单中我有永久字段:

   <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>

我正在尝试使用这种方法添加一个新的项目

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

我得到的不完全是我想要的: 结果

有人知道如何解决这个问题吗?或者为什么会发生这种情况? 我不知道在哪里以及如何保存有关添加元素的信息。有什么想法吗?


你看到抽屉的源代码了吗?如果你在抽屉里进行了更改,请记得将其无效化/重新加载。 - deadfish
当然,问题是我不能在Item2下面添加新项。 当我调用addNewItem方法时,新项不会出现在分隔符上面的第一组中,而是出现在菜单底部。 - Skye
方法 addHeaderView() 怎么样? - deadfish
@Skye,你找到解决方法了吗?我也遇到了完全相同的问题。 - irobotxx
@manuelJ 是的,当您有带有图标/图片的项目并且尝试动态添加项目时,该项目将被添加到当前项目下方。我也尝试了自定义库,但它也没有起作用。我的解决方案是将项目写入XML文件中,在添加或删除项目(从XML文件中)后,抽屉菜单应重新加载。 - Skye
3个回答

31

来自Technotalkative

要在程序中添加项目,我们可以使用NavigationViewgetMenu()方法获取一个菜单对象,然后可以使用该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);
}
如果您想与菜单进行交互,请使用menu.add(0, itemId, 0, title);,然后进行操作。
 public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

id将为您提供分配的itemId


14

假设你有两个组,group1和group2。如果你想要动态地向group1添加项目,那么你可以为group2分配优先级,使其始终在group1下方。这样,当你向group1添加新项目时,它不会被插入到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>

并且当您将菜单项添加到group1时:

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

这应该会起作用。我在安卓设计库23.1.1上进行了测试。


菜单已添加,但始终添加在顶部位置,我无法将其添加到所需位置。有什么想法吗? - Hitesh Dhamshaniya
@HiteshDhamshaniya,您仍然可以在Menu.add()方法中使用order参数。较大的顺序将被排序到底部。 - Hexise

2
<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中将其设置为不可见,并通过以下方式在程序中设置为可见。"最初的回答"。
如果您想动态向导航抽屉添加项目,则应该在xml中将其设置为不可见,然后通过编程方式将其设置为可见,如下所示。
NavigationView navigationView = findViewById(R.id.nav_view);
Menu menu=navigationView.getMenu();
menu.findItem(R.id.send_notification).setVisible(true);

最初的回答
这就是它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接