2015-06-07 16 views
33

Tôi đang cố gắng thêm các mục menu mới vào menu phụ trong bảng ngăn kéo Material Design mới.Cách lập trình thêm mục menu phụ vào thư viện hỗ trợ android design material mới

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

tôi làm có @ menu/cài đặt menu_nav nhưng bây giờ muốn để thêm các mục trình đơn mới:

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. 

Các mục trình đơn từ file @ menu/menu_nav được hiển thị, nhưng những người mới được bổ sung không phải. Bất kỳ ý tưởng nào về cách thực hiện điều đó?

Trả lời

59

[Cập nhật 20-03-2016] Lỗi được giải quyết. Vì vậy không cần phải lo lắng.

[contetnt bên dưới Đây là lỗi thời.]

Tạo menu động NavigationView hiện là lỗi trên Hỗ trợ thiết kế thư viện. Và Tôi đã báo cáo nó để theo dõi nguồn lỗi android. Vì vậy, chờ cho đến khi lỗi sẽ được sửa. Nhưng nếu bạn muốn giải pháp tạm thời bạn có thể làm điều đó. Đầu tiên thêm menu động của bạn ..

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"); 

Sau khi thêm thực đơn của bạn chỉ cần viết dưới mã ..

MenuItem mi = m.getItem(m.size()-1); 
    mi.setTitle(mi.getTitle()); 

Đó là hiện giải pháp hacky. Nhưng việc cho tôi ...

[cập nhật 26-06-2015]

Như tôi đã thông báo lỗi này tại nguồn Bug Android Bây giờ Bug được đánh dấu là một phiên bản tương lai , đây là liên kết https://code.google.com/p/android/issues/detail?id=176300

Vì vậy, chúng tôi có thể nói rằng lỗi không còn tồn tại trên thư viện trong tương lai. Vì vậy, bạn không phải sử dụng giải pháp khôn lanh. tôi cũng sẽ cập nhật lại câu trả lời này khi số phát hành phiên bản tương lai được duy trì cho lỗi này.

+0

Ông có thể liên kết các báo cáo lỗi xin vui lòng? – Moritur

+1

đây là liên kết: https://code.google.com/p/android/issues/detail?id=176300 – Moinkhan

17

Bạn có thể thêm và xóa mục khỏi chế độ xem điều hướng bằng cách thay đổi chế độ hiển thị. Nhận mục tại index và setVisible thành true để hiển thị và false để ẩn nó.

MenuItem item = navigationView.getMenu().getItem(3); 
item.setVisible(false); 
+0

chèn * Thực ra tôi thậm chí không điên .... đó là tuyệt vời * meme ở đây! ... Tôi nghĩ rằng mặc dù đây là một mẹo khó nhưng nó là cách dọn dẹp cho những gì tôi muốn ... để ẩn các menu dựa trên các quyền người dùng đã đăng nhập ... tốt đẹp! –

14

Tôi đã tìm thấy cách dễ dàng hơn để thay đổi chế độ xem điều hướng (làm việc với cả menu con và menu). Bạn có thể tăng lại NavigationView khi chạy với 2 dòng mã. Trong ví dụ này, tôi lại thổi phồng new_navigation_drawer_items.xml sử dụng phương pháp nào inflateMenu (Bạn có thể tạo một tập tin xml menu với menu con mới của bạn)

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

Bạn nói đúng. Nhưng bạn đang nói về menu cố định tĩnh. Trong khi câu hỏi được yêu cầu cho các menu động, được thêm theo chương trình. Trong trường hợp đó câu trả lời của bạn không hữu ích. – Moinkhan

3

Sử dụng phương pháp này để thêm menu và menu con

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

và cuộc gọi phương pháp này, nơi bạn thiết lập Nội dung ngăn kéo.

2

Đây là cách tôi thao tác các mục sub-menu trong NavigationView

1) Tạo menu.tập tin 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>

2) Thao tác menu bằng cách gọi chức năng này

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

enter image description here

Các vấn đề liên quan