如何在NavigationView中添加具有图标和标题的菜单项?

8

现在我正在尝试将新的Design Support库(22.2.1)中的DrawerLayout / NavigationView实现到我的应用程序中。我已经在互联网上,特别是在stackoverflow上搜索了如何添加带有图标和标题的子菜单的MenuItem。 我知道可以添加一个带有标题或图标的菜单项。

像这样:

        Menu m = mNavigationView.getMenu();
        m.add(R.id.groupID,R.id.menuItemID,orderNumber,"title");

但是这只是一个带有标题的菜单项,没有图标。 是否可以添加一个同时具有标题图标的菜单项?


好的,您可以像给出的答案一样使用 XML 轻松地添加标题和图标。但是,如果您正在动态添加它,则当前在设计支持库上存在一个错误... https://dev59.com/V10a5IYBdhLWcg3wHlik#30706233 - Moinkhan
嘿,Moinkhan,在你的stackoverflow链接中没有提到添加带有图标和标题的MenuItem的可能性。因此,无法通过编程方式添加带有图标和标题的子菜单项吗? - pimato
如果您无法添加菜单项,则也无法添加子菜单。但是,这个错误已被标记为将来的版本……因此在将来的库中可能会实现。目前从程序上来说还不可能。 - Moinkhan
你好,我正在尝试同样的事情,这个 bug 现在已经解决了吗?现在可以实现吗?如果可以,我该怎么做? - Snehangshu Kar
4个回答

20

首先从 NavigationView 中获取菜单:

Menu menu = mNavigationView.getMenu();
然后将您的项目添加到菜单中,记得获取返回的 MenuItem,这样您就可以稍后添加图标:
MenuItem item = menu.add(groupId, menuItemId, Order, "Menu Item 1 Title");
item.setIcon(R.drawable.ic_some_menu_item_icon); // add icon with drawable resource

这段代码是有效的。当开发者在菜单中找不到任何添加字符串和可绘制对象的方法时,可能会感到困惑。但是menu.add方法返回MenuItem,使得可以设置图标和其他属性。 - Prashant

3
创建菜单如下:
<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item
     android:id="@+id/nav_home"
     android:icon="@drawable/ic_dashboard"
     android:title="Home" />

 <item android:title="Sub items">
    <menu>
        <item
            android:icon="@drawable/ic_dashboard"
            android:title="Sub item 1" />
        <item
            android:icon="@drawable/ic_forum"
            android:title="Sub item 2" />
    </menu>
</item>
</menu>

这里是一个示例应用程序。 https://github.com/chrisbanes/cheesesquare

2
抱歉,我从未提到我想以编程方式完成它。这就是为什么我只发布了Java代码。 - pimato
但是如何为子项添加图标,而不是每个菜单项? - worked

2

要通过图标以编程方式添加菜单项,您需要首先使用此方法添加具有id和title的菜单:

 menu.add( groupId, menuItemId, Order, "title" );

使用id获取该项并设置图标。

 menu.findItem( menuItemId ).setIcon( R.drawable.ic_add_black );

0

我发现了更简单的方法来改变导航视图(适用于子菜单和菜单)。您可以使用两行代码在运行时重新填充NavigationView。在这个例子中,当用户成功登录时,我使用new_navigation_drawer_items.xml重新填充。

navigationView.getMenu().clear(); //clear old inflated items.
navigationView.inflateMenu(R.menu.logged_in_navigation_drawer_items); //inflate new items.

当用户注销时,只需重新使用logged_out_navigation_drawer_items.xml进行重新填充即可。

navigationView.getMenu().clear(); //clear old inflated items.
navigationView.inflateMenu(R.menu.logged_out_navigation_drawer_items); //inflate new items.

实际上它会重新填充项目,但不会向现有项目添加新项目。只需创建自己的menu.xml文件即可。


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