如何以编程方式将子菜单项添加到新的材质设计android支持库

Mor*_*tur 38 android navigation-drawer material-design

我正在尝试将新菜单项添加到新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>
Run Code Online (Sandbox Code Playgroud)

我有@ 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.
Run Code Online (Sandbox Code Playgroud)

显示@ menu/menu_nav文件中的菜单项,但新添加的菜单项不是.任何想法如何做到这一点?

Moi*_*han 65

[更新20-03-2016] 错误已解决.所以不用担心.

[以下内容已过时.]

向NavigationView添加动态菜单是Design Support库中的错误.而我把它报告给Android的错误源跟踪.所以等到bug修好了.但是如果你想要临时解决方案,你可以做到.首先添加动态菜单..

    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");
Run Code Online (Sandbox Code Playgroud)

添加菜单后,只需写下代码..

    MenuItem mi = m.getItem(m.size()-1);
    mi.setTitle(mi.getTitle());
Run Code Online (Sandbox Code Playgroud)

它目前是hacky解决方案.但是为我工作......

[更新26-06-2015]

正如我在Android Bug源上报告此错误现在Bug被标记为未来版本,这里是链接https://code.google.com/p/android/issues/detail?id=176300

所以我们可以说这个bug在未来的库中不再存在.所以你不必使用棘手的解决方案.当Future版本号是此bug的主要内容时,我还将再次更新此答案.


vik*_*koo 19

您可以通过更改可见性来在导航视图中添加和删除项目.获取index处的项目,将setVisible设置为true以显示,将false设置为隐藏它.

MenuItem item = navigationView.getMenu().getItem(3);
item.setVisible(false);
Run Code Online (Sandbox Code Playgroud)


Nam*_*ung 17

我找到了更简单的方法来更改导航视图(使用子菜单和菜单).您可以NavigationView在运行时使用2行代码重新充气.在这个例子中,我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.
Run Code Online (Sandbox Code Playgroud)

  • 你是对的.但是你在谈论静态固定菜单.虽然问题是动态菜单,但是以编程方式添加.在这种情况下,你的答案没有帮助. (5认同)

Pra*_*rma 5

使用此方法添加菜单和子菜单

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();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

并在您设置抽屉内容的地方调用此方法。


小智 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>
Run Code Online (Sandbox Code Playgroud)

2)通过调用该函数来操作菜单

        /// <summary>
    /// 
    /// </summary>
    /// <param name="navView"></param>
    private void AddNavigationMenuItem (NavigationView navView)
    {
        navView.Menu.FindItem(Resource.Id.mnugrp_Index).SubMenu.Clear();
        navView.Menu.FindItem(Resource.Id.mnugrp_Index).SubMenu.Add("This is Index 1");
        navView.Menu.FindItem(Resource.Id.mnugrp_Index).SubMenu.Add("This is Index 2");
        navView.Menu.FindItem(Resource.Id.mnugrp_Index).SubMenu.Add("This is Index 3");
        navView.Menu.FindItem(Resource.Id.mnugrp_Index).SubMenu.Add("This is Index 4");

        navView.Menu.FindItem(Resource.Id.mnugrp_Attachment).SubMenu.Clear();
        navView.Menu.FindItem(Resource.Id.mnugrp_Attachment).SubMenu.Add("This is Attachment 1");
        navView.Menu.FindItem(Resource.Id.mnugrp_Attachment).SubMenu.Add("This is Attachment 2");
        navView.Menu.FindItem(Resource.Id.mnugrp_Attachment).SubMenu.Add("This is Attachment 3");
        navView.Menu.FindItem(Resource.Id.mnugrp_Attachment).SubMenu.Add("This is Attachment 4");
    }
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述