2015-06-03 17 views
8

Tôi đang cố gắng thêm submenu mục vào NavigationView theo chương trình. Tôi có thể thêm các mục vào menu nhưng không thành submenuCách thêm mục menu phụ vào NavigationView theo chương trình thay vì menu xml

Thêm mục vào menu làm việc

Menu menu = mNavigationView.getMenu(); 
menu.add(Menu.NONE, Menu.NONE, index, "Menu Item1"); 

Nhưng thêm các mục vào menu phụ không hoạt động

Menu menu = mNavigationView.getMenu(); 
SubMenu subMenu = menu.addSubMenu("Sub menu title"); 
subMenu.add(Menu.NONE, Menu.NONE, index, "SubMenu Item1"); 

Trả lời

12

Bí quyết gọi BaseAdapter.notifyDataSetChanged trên cơ sở Adapter có chứa các mục menu. Bạn có thể sử dụng sự phản chiếu để lấy ListView hoặc chỉ lặp lại trên các trẻ em NavigationView cho đến khi bạn đạt tới nó.

Đây không phải là mã được cập nhật nhất, vì tôi biết Google đã không đẩy các thay đổi gần đây nhất vào Thư viện hỗ trợ, nhưng về cơ bản, NavigationMenuPresenter.prepareMenuItems được gọi khi bạn gọi BaseAdpater.notifyDataSetChanged.

Nhưng nếu bạn muốn xem nguồn gần đây nhất, bạn có thể tải xuống thông qua SDK Manager. Chọn Nguồn cho Android MNC. Sau đó điều hướng đến

yourAndroidSDK/sources/android-MNC/android/support/design/internal/NavigationMenuPresenter.java 

sources

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 
    final Menu menu = mNavigationView.getMenu(); 
    for (int i = 0; i < 4; i++) { 
     menu.add("Menu Item " + (i + 1)); 
    } 
    final SubMenu subMenu = menu.addSubMenu("SubMenu Title"); 
    for (int i = 0; i < 2; i++) { 
     subMenu.add("SubMenu Item " + (i + 1)); 
    } 
    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(); 
     } 
    } 

} 

Kết quả

results

+1

Nhờ nó hoạt động. Nhưng nó phải là một cách đơn giản hơn việc xem danh sách và làm mới. – Libin

+1

Vâng, tôi đồng ý. Và tôi hình dung những thứ như thế sẽ mượt hơn một chút khi thư viện thiết kế mới tiến triển. Vui mừng nó hoạt động cho bạn mặc dù. – adneal

+1

Điều gì về việc thêm menu con không có tiêu đề? Nó để lại không gian ở đó! Có thể là một vấn đề! –

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