Come impostare il comportmento controllabile condiviso in tutti i gruppi in NavigationView?

Ho creato due gruppi con ids unici (ho bisogno di un divisore) e entrambi hanno il checkableBehavior impostato su singolo . Ciò consente di controllare contemporaneamente più voci di diversi gruppi e questo è esattamente quello che sto cercando di evitare. Mi piacerebbe avere un elemento controllato al massimo, in tutti i gruppi.

Dal momento che non ho trovato alcun modo per farlo in XML, ho cercato di implementare una logica semplice in onNavigationItemSelected per deselect la voce di menu precedente:

  • Come rendere più efficiente il path?
  • Come faccio a distriggersre il portle hdmi di un dispositivo android senza radicarlo?
  • Android: Condividi Bitmap non salvato in SD
  • Come rilevare i clic del button di sistema "recenti applicazioni" (Honeycomb +)
  • Android - Pass object tramite bluetooth
  • Imansible risolvere tutte le dependencies per la configuration ': classpath'
  •  if (previousItem != null) previousItem.setChecked(false); currentItem.setChecked(true); 

    ma il setChecked(false) non ha mai funzionato per me – l'object rimane controllato.

    Ecco il mio codice di esempio:

    menu_navigation.xml:

     <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:id="@+id/nav_group_1" android:checkableBehavior="single"> <item android:id="@+id/nav_feed" android:title="@string/feed"/> <item android:id="@+id/nav_people" android:title="@string/people"/> </group> <group android:id="@+id/nav_group_2" android:checkableBehavior="single"> <item android:id="@+id/nav_settings" android:title="@string/settings"/> <item android:id="@+id/nav_help_feedback" android:title="@string/help_feedback"/> <item android:id="@+id/nav_logout" android:title="@string/logout"/> </group> 

    NavigationItemSelectedListener:

      mUiNavigationView.setNavigationItemSelectedListener( new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { if (previousItem != null) previousItem.setChecked(false); currentItem.setChecked(true); //... changeCurrentFragment(...); return true; } }); 

    Ho bisogno di un suggerimento! Grazie.

  • Android ViewPager e TabLayout non funzionano velocemente
  • Il frammento addToBackStack () e popBackStackImmediate () non funzionano
  • Come comprendere la struttura di directory dell'tree di root android?
  • NullPointerException: lock == null
  • Come aprire la cartella My Files in Android Programmaticamente (utilizzando Intent)?
  • getLocationOnScreen () vs getLocationInWindow ()
  • 6 Solutions collect form web for “Come impostare il comportmento controllabile condiviso in tutti i gruppi in NavigationView?”

    Ecco la soluzione.

    Fase 1: Rimuovi

     android:checkableBehavior="single" 

    da entrambi i gruppi.

    Fase 2: Aggiunta alla logica seguente all'ascoltatore:

     mUiNavigationView.setNavigationItemSelectedListener( new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { menuItem.setCheckable(true); menuItem.setChecked(true); if (mPreviousMenuItem != null) { mPreviousMenuItem.setChecked(false); } mPreviousMenuItem = menuItem; //... changeCurrentFragment(...); return true; } }); 

    Nota: invece di call menuItem.setCheckable(true) puoi impostare android:checkable="true" per each elemento in XML.

    @ La soluzione di Moinkhan dovrebbe funzionare pure (grazie, upvoted), ma non ho voluto passare attraverso gli elementi del menu each volta che si seleziona una nuova posizione.

    In realtà, non è necessario separare gruppi separati separati. Puoi avere tutto in un gruppo e inserire sottomenu (titoli) o sottogruppi (nessun titolo). Ci saranno separatori per quei sottomenu e sottogruppi. In questo modo il comportmento controllabile funziona senza una soluzione alternativa. (Fyi: Questo è il progetto di supporto Lib 23.1.1)

    Menu con divisori

     <group android:id="@+id/drawer_group" android:checkableBehavior="single"> <item android:id="@+id/nav_1" android:title="Menu1" /> <item android:id="@+id/nav_2" android:title="Menu2" /> <item android:id="@+id/nav_3" android:title="Menu3" /> <item android:id="@+id/nav_4" android:title="Menu4" /> <item android:id="@+id/drawer_submenu" android:title="Subheader"> <menu> <group android:checkableBehavior="single"> <item android:id="@+id/nav_sub1_1" android:title="Menu_Sub1_1" /> <item android:id="@+id/nav_sub1_2" android:title="Menu_Sub1_2" /> </group> </menu> </item> <group android:id="@+id/drawer_subgroup"> <item android:id="@+id/nav_subgroup_item" android:title="Menu_Sub2_2" /> </group> </group> 

    In codice, faccio semplicemente le seguenti operazioni di controllo singolo come previsto:

     @Override public boolean onNavigationItemSelected(MenuItem item) { mNavigationView.setCheckedItem(item.getItemId()); ... } 

    Non c'è bisogno di rimuovere checkableBehavior="single" , basta usare

     navigationView.setCheckedItem(item.getItemId()); 

    invece di item.setChecked(true) .

    Ok ho trovato la soluzione .. basta aggiungere questo codice snippet al metodo onNavigationItemSelected

     @Override public boolean onNavigationItemSelected(MenuItem menuItem) { Menu m = navView.getMenu(); for (int i=0;i<m.size();i++) { MenuItem mi = m.getItem(i); if (!(mi.getItemId() == menuItem.getItemId())) { mi.setCheckable(false); } } menuItem.setCheckable(true); menuItem.setChecked(true); return false; } 

    questo è .. E sì setChecked (false) non funziona. Solo perché dall'elenco del menu ci dovrebbe essere un unico elemento deve essere cheked. Quindi è ansible solo deselezionarla quando si seleziona un altro elemento. Se si fa clic su un elemento selezionato, la visualizzazione di navigazione non verrà mai distriggersta. Proprio perché lo scenario che ho spiegato.

    Sembra che si setCheckable() un errore di invalidazione nell'implementazione di NavigationView , ma non è necessario utilizzare setCheckable() , è sufficiente annullare la NavigationView dopo aver chiamato setChecked(false) come setChecked(false) :

      previousItem.setChecked(false); navigationView.invalidate(); 

    Tuttavia il gruppo di menu non deve avere checkableBehavior="single" perché in modalità esclusiva di chiamata setChecked(boolean) in un MenuItem nel gruppo imposta l'elemento come controllato se si passa vero o falso. Quindi, in modo che il setChecked(false) funzioni, è necessario rimuovere checkableBehavior="single" dalle definizioni dei menu.

    Ho creato un problema qui: https://code.google.com/p/android/issues/detail?id=178709

    Ecco una soluzione semplice e dolce che ho postato qui 🙂

    Fare gruppi diversi crea un divisore in mezzo Ma crea il problema di due elementi selezionati nel cassetto di navigazione.

    Un modo semplice come ho gestito questo era:

      public boolean onNavigationItemSelected(final MenuItem menuItem) { //if an item from extras group is clicked,refresh NAV_ITEMS_MAIN to remove previously checked item if (menuItem.getGroupId() == NAV_ITEMS_EXTRA) { navigationView.getMenu().setGroupCheckable(NAV_ITEMS_MAIN, false, true); navigationView.getMenu().setGroupCheckable(NAV_ITEMS_EXTRA, true, true); }else{ navigationView.getMenu().setGroupCheckable(NAV_ITEMS_MAIN, true, true); navigationView.getMenu().setGroupCheckable(NAV_ITEMS_EXTRA, false, true); } //Update highlighted item in the navigation menu menuItem.setChecked(true); 

    }

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.