2016-03-17 16 views

Trả lời

30

này sẽ bỏ chọn tất cả các mục

int size = mNavigationView.getMenu().size(); 
    for (int i = 0; i < size; i++) { 
     mNavigationView.getMenu().getItem(i).setChecked(false); 
    } 
+0

tôi không biết sau khi sử dụng mã của bạn nó đem lại cho tôi một khoảng trống! – phpdroid

+1

trong trường hợp của tôi, sau khi sử dụng kỹ thuật của bạn, tôi đã kiểm tra mục cuối cùng và tôi không thể giải quyết nó. hãy giúp tôi ... – takmilul

+0

@takmilul đảm bảo bạn sử dụng 'setChecked (false);' không 'true' – arsent

19

tôi thấy giải pháp @arsent và cho nó một thử, và nó thực sự sẽ làm những gì bạn muốn, mà là để bỏ chọn tất cả các mục ... nhưng, tôi đã có một vấn đề trong các tình huống sau:

  1. Chọn mục trình đơn 1 (sử dụng NavigationView#setCheckedItem)
  2. Bỏ chọn tất cả các mục theo @ arsent của giải pháp
  3. Selec t mục menu 1 lần nữa (sử dụng NavigationView#setCheckedItem)

Trong trường hợp này, mục 1 sẽ không được đánh dấu là đã chọn. Đó là vì trong chế độ xem điều hướng theo dõi mục đã chọn trước đó được đặt ở bước 1, không thay đổi ở bước 2 và nó chỉ bỏ qua bước 3 vì mục đã chọn trước đó giống với mục chúng tôi đang chọn bây giờ.

Đề nghị của tôi (và một giải pháp thay thế) để tránh điều này chỉ là có một hình nộm mục vô hình và sử dụng NavigationView#setCheckedItem để chọn item mà bất cứ khi nào bạn muốn bỏ chọn tất cả, như vậy

<item 
    android:id="@+id/menu_none" 
    android:title="" 
    android:visible="false"/> 

Để bỏ chọn tất cả chỉ là làm

mNavigationView.setCheckedItem(R.id.menu_none); 
1

Giải pháp của Joao không hoạt động như tôi mong đợi. Điều này sẽ dẫn đến khoảng trống từ Chế độ xem mục không được kiểm soát trên Điều hướng của tôi.

Chỉ cần chắc chắn để thiết lập các quan điểm như đi:

<item 
    android:id="@+id/your_menu_item_id_to_hide" 
    android:title="" 
    android:visible="false"/> 


bottomNavigationView.getMenu().findItem(R.id.your_menu_item_id_to_hide).setChecked(true); 
    bottomNavigationView.findViewById(R.id.your_menu_item_id_to_hide).setVisibility(View.GONE); 

giải pháp Arsent là không cần thiết trong trường hợp này.

+0

Tôi đã có cùng một vấn đề này và tôi đã sửa nó, nhưng tôi không thể nhớ ngay bây giờ như thế nào. Kiểm tra lại các thông số xml trên các tệp bố cục của bạn –

+0

ah đó là chế độ xem điều hướng dưới cùng, gần đây là loại. Tôi đã không bao giờ thử giải pháp của tôi với thành phần đó, nhưng tốt để biết bạn quản lý để tinh chỉnh nó. –

12

Để bỏ chọn tất cả MenuItems bao gồm SubMenu mục mà bạn phải sử dụng đệ quy -

private void unCheckAllMenuItems(@NonNull final Menu menu) { 
     int size = menu.size(); 
     for (int i = 0; i < size; i++) { 
      final MenuItem item = menu.getItem(i); 
      if(item.hasSubMenu()) { 
       // Un check sub menu items 
       unCheckAllMenuItems(item.getSubMenu()); 
      } else { 
       item.setChecked(false); 
      } 
     } 
    } 

Gọi phương pháp nêu trên để bỏ chọn tất cả các mục, như dưới đây -

unCheckAllMenuItems(navigationView.getMenu()); 
+2

giá trị được thăng hạng khi được đề cập đến menu phụ –

+1

Câu trả lời đúng, – exshinigami

0

Tất cả bạn cần làm là xung quanh bạn các nhóm như thế này:

<group> 
    <group 
     android:id="@+id/grp1"> 
     <item 
      android:id="@+id/nav_profile" 
      android:icon="@drawable/ic_account_circle_24dp" 
      android:title="@string/profile" /> 
    </group> 
    <group 
     android:id="@+id/grp2"> 
     <item 
      android:id="@+id/nav_settings" 
      android:icon="@drawable/ic_settings_24dp" 
      android:title="@string/settings" /> 
     <item 
      android:id="@+id/nav_help" 
      android:icon="@drawable/topic_help" 
      android:title="@string/help_feedback" /> 
    </group> 
</group> 

Không cần t o các mục menu vòng lặp có thêm chi phí!

0

Tôi đoán một người như tôi sử dụng các phương pháp đó chỉ như thế này

public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.nav_today: 
      break; 
     case R.id.nav_calendar: 
      navigationView.getMenu().performIdentifierAction(R.id.nav_today, 0); 
      navigationView.getMenu().getItem(0).setChecked(true);//or 
      navigationView.setCheckedItem(R.id.nav_today);//or 
      drawerLayout.closeDrawers(); 
      break; 
    } 
    return true; 
} 

Đang cố gắng để kiểm tra R.id.nav_today sau khi bạn nhấp vào R.id.nav_calendar, (btw: checkableBehavior="single"), tiếc là nó sẽ không làm việc.

Đó là vì sau khi mã của bạn navigationView.setCheckedItem(R.id.nav_today) được gọi thì R.id.nav_today sẽ được kiểm tra ngay lập tức, nhưng sau đó, nhấp chuột của bạn trên R.id.nav_calendar sẽ tự kiểm tra.

Đó là lý do tại sao mọi phương pháp bạn sử dụng dường như không bao giờ hoạt động. Đó là công việc, nhưng được ghi đè ngay lập tức.

0

Trích dẫn @Được chuyển đổi, có "không cần các mục menu vòng lặp có thêm chi phí!". Tuy nhiên, không cần phải tạo nhiều nhóm (trong trường hợp này anh ta đang tạo @+id/grp1@+id/grp2) để bỏ chọn một mục đã chọn trước đó.

Bạn có thể đơn giản thêm một nhóm duy nhất cho tất cả các yếu tố với android:checkableBehavior, như thế này:

<group android:checkableBehavior="single"> 
    <item 
     android:id="@+id/id1" 
     android:checked="true" 
     android:icon="@drawable/drawable1" 
     android:title="@string/string1" /> 

    <item 
     android:id="@+id/id2" 
     android:icon="@drawable/drawable2" 
     android:title="@string/string2" /> 
</group> 

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