Come creare un semplice divisore nella nuova navigazione?

Google ha introdotto la NavigationView nella versione 22.2.0 della Libreria di Design Support, con la quale è ansible creare facilmente un cassetto utilizzando una risorsa di menu.

Come posso creare una semplice linea divisoria tra due elementi? Il raggruppamento degli articoli non funzionava. Creare una sezione di sottogruppi crea una linea di divisore, ma richiede un titolo che non voglio.

  • Come creare un emulatore di risoluzione dello schermo da 7 "(1280 * 800) in Android?
  • Ordina strings.xml di Android in ordine alfabetico
  • Come analizzare XML utilizzando il parser SAX
  • Il modo migliore per colbind un token FCM a un dispositivo?
  • Client TCP Android
  • Utilizzo delle tabs di scorrimento con la barra degli strumenti
  • Qualsiasi aiuto sarebbe apprezzato.

  • Come continuamente get RSSI senza connettersi al dispositivo BLE?
  • bloccare l'orientamento dello schermo androidi al paesaggio
  • Phonegap Android LocalFileSystem non è definito
  • BasicAuthentication in android per la visualizzazione web non funzionante
  • Come avviare la transizione di elementi condivisi utilizzando i frammenti?
  • FusedLocationApi.getLastLocation sempre null
  • 10 Solutions collect form web for “Come creare un semplice divisore nella nuova navigazione?”

    Tutto quello che devi fare è definire un group con un ID univoco , ho verificato l'implementazione se il gruppo ha differenti ID che creerà un divisore.

    Guarda l'origine Android:

    Vedere l'implementazione sul numero di linea 517

    Menu di esempio, creando il separatore:

     <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> <group android:id="@+id/grp1" android:checkableBehavior="single" > <item android:id="@+id/navigation_item_1" android:checked="true" android:icon="@drawable/ic_home" android:title="@string/navigation_item_1" /> </group> <group android:id="@+id/grp2" android:checkableBehavior="single" > <item android:id="@+id/navigation_item_2" android:icon="@drawable/ic_home" android:title="@string/navigation_item_2" /> </group> </menu> 

    creare un drawable drawer_item_bg.xml come questo,

      <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle" > <solid android:color="#F4F4F4" /> </shape> </item> <item android:top="-2dp" android:right="-2dp" android:left="-2dp"> <shape> <solid android:color="@android:color/transparent" /> <stroke android:width="1dp" android:color="#EAEAEA" /> </shape> <!-- android:dashGap="10px" android:dashWidth="10px" --> </item> </layer-list> 

    e aggiungilo a NavigationView come app: itemBackground = "@ drawable / drawer_item_bg"

     <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:background="#F4F4F4" android:layout_gravity="start" android:fitsSystemWindows="false" app:menu="@menu/activity_main_drawer" app:itemBackground="@drawable/drawer_item_bg"/> 

    e qui andiamo … screenshot

    Penso di avere una soluzione ancora migliore per il problema di più elementi controllati. Utilizzando il mio modo non devi preoccuparti di modificare il codice quando aggiungete nuove sezioni al tuo menu. Il mio menu sembra proprio come la soluzione accettata scritta da Jared, con la differenza di utilizzo di andoid: checkableBehavior = " tutto " nei gruppi:

     <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:id="@+id/first_section" android:checkableBehavior="all"> <item android:id="@+id/frontpage" android:icon="@drawable/ic_action_home_24dp_light_blue" android:title="@string/drawer_frontpage" /> <item android:id="@+id/search" android:icon="@drawable/ic_search" android:title="@string/drawer_search" /> </group> <group android:id="@+id/second_section" android:checkableBehavior="all"> <item android:id="@+id/events" android:icon="@drawable/ic_maps_local_movies_24dp_light_blue" android:title="@string/drawer_events" /> </group> </menu> 

    Il comportmento checkable di "tutto" consente di controllare / deselect singoli elementi a volontà, indipendentemente dal gruppo a cui appartengono. Devi solo memorizzare l'ultimo menuitem selezionato. Il codice java è simile a questo:

     private MenuItem activeMenuItem; @Override public boolean onNavigationItemSelected(MenuItem menuItem) { // Update selected/deselected MenuItems if (activeMenuItem != null) activeMenuItem.setChecked(false); activeMenuItem = menuItem; menuItem.setChecked(true); drawerLayout.closeDrawers(); return true; } 

    Fare gruppi diversi come la risposta di Nilesh fa 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); } 

    Semplice aggiungere DeviderItemDecoration:

     NavigationView navigationView = (NavigationView) findViewById(R.id.navigation); NavigationMenuView navMenuView = (NavigationMenuView) navigationView.getChildAt(0); navMenuView.addItemDecoration(new DividerItemDecoration(MainActivity.this,DividerItemDecoration.VERTICAL)); 

    Sembra così:

    immettere qui la descrizione dell'immagine

    Volevo dividere sopra il primo articolo e dopo l'ultimo elemento. Usando la soluzione @Nilesh ho dovuto aggiungere elementi di menu dummy e impostare abilitato a false che si sentivano veramente sporchi. Cosa succede se voglio fare altre cose cool nel mio menu?

    Ho notato che la NavigationView estende FrameLayout in modo da poter mettere il proprio contenuto in esso proprio come si farebbe per una FrameLayout. Impostare quindi un menu vuoto xml in modo che visualizzi solo il layout personalizzato. Capisco che questo probabilmente va contro il cammino che Google vuole prendere ma se vuoi un menu veramente personalizzato, questo è un modo semplice per farlo.

     <!--Note: NavigationView extends FrameLayout so we can put whatever we want in it.--> <!--I don't set headerLayout since we can now put that in our custom content view--> <android.support.design.widget.NavigationView android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:menu="@menu/empty_menu"> <!--CUSTOM CONTENT--> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- CUSTOM HEADER --> <include android:id="@+id/vNavigationViewHeader" layout="@layout/navigation_view_header"/> <!--CUSTOM MENU--> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_below="@+id/vNavigationViewHeader"> <View style="@style/NavigationViewLineSeperator"/> <Button android:text="Option 1"/> <View style="@style/NavigationViewLineSeperator"/> <Button android:text="Option 2"/> <View style="@style/NavigationViewLineSeperator"/> </LinearLayout> </RelativeLayout> </android.support.design.widget.NavigationView> 

    Ecco lo stile

     <style name="NavigationViewLineSeperator"> <item name="android:background">@drawable/line_seperator</item> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">1dp</item> </style> 

    E disegnabile

     <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="@color/white"/> <size android:width="100sp" android:height="1sp" /> </shape> 

    E il menu

     <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> </menu> 

    edit:

    Invece dei pulsanti è ansible utilizzare TextView con disegni che imitano gli aspetti originali delle voci di menu:

      <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/menu_support" android:drawableLeft="@drawable/menu_icon_support" style="@style/MainMenuText" /> // style.xml <style name="MainMenuText"> <item name="android:drawablePadding">12dp</item> <item name="android:padding">10dp</item> <item name="android:gravity">center_vertical</item> <item name="android:textColor">#fff</item> </style> 

    Il credito dovrebbe andare a Zorawar per la soluzione, Spiacente per duplicare la risposta, ma non ha potuto aggiungere tantissimo text formattato all'interno di un commento.

    La soluzione di Zorawar funziona, il codice potrebbe essere migliorato in quanto tale:

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

    Non sono sicuro se questo è fisso in API 26 (Android 8) o è stato ansible tutto il tempo. Sono ancora un noob nella programmazione Android. Tuttavia ho aggiunto i gruppi genitori come sotto. Testare sul telefono fisico Android 6,

    1. Ho il divisore
    2. La selezione di qualsiasi elemento da nav_g1 o nav_g2 deselezionerà altre voci.
    3. Nessun imbottitura aggiuntiva aggiunta a causa di gruppi annidati.
    4. Non ho aggiunto alcun codice Java agli ascoltatori

    Codice del menù

     <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <group android:id="@+id/nav_g1" android:checkableBehavior="single"> <item android:id="@+id/nav_1" android:icon="@drawable/ic_menu_share" android:title="@string/nav_1"/> <item android:id="@+id/nav_2" android:icon="@drawable/ic_menu_share" android:title="@string/nav_2"/> </group> <group android:id="@+id/nav_g2" android:checkableBehavior="single"> <item android:id="@+id/nav_3" android:icon="@drawable/ic_menu_share" android:title="@string/nav_3"/> <item android:id="@+id/nav_4" android:icon="@drawable/ic_menu_share" android:title="@string/nav_4"/> </group> </group> <item android:title="Actions"> <menu> <item android:id="@+id/nav_7" android:icon="@drawable/ic_menu_share" android:title="@string/nav_7"/> <item android:id="@+id/nav_8" android:icon="@drawable/ic_menu_share" android:title="@string/nav_8"/> </menu> </item> </menu> 

    Gli appunti

    1. Come indicato in questa risposta, each gruppo deve disporre di un id unico per mostrare il divisore.
    2. Come per gli spazi di risposta corrispondono alle specifiche di progettazione di Google.
    3. Avendo android:checkableBehavior="single" per il gruppo di genitori è necessario in modo che il problema di più elementi di menu selezionati in questa risposta (menzionato nei commenti da parte di hungryghost) non accada

    Ecco lo screenshot

    Schermata dello schermo del dispositivo

    La risposta di Nile è giusta, tranne che ha un difetto di controllo doppio.

     <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single" android:id="@+id/grp1"> <item android:id="@+id/nav_register_customer" android:icon="@drawable/ic_menu_camera" android:checkableBehavior="none" android:title="Register Customer" /> </group> <group android:id="@+id/grp2" android:checkableBehavior="single" > <item android:id="@+id/nav_slideshow" android:icon="@drawable/ic_menu_slideshow" android:checkableBehavior="none" android:title="Slideshow" /> </group> </menu> 

    Così usando

    Android: checkableBehavior = "single"

    con id unico deve risolvere il problema

    Se si desidera aggiungere dynamicmente il divisore, è sufficiente aggiungere un sottomenu vuoto come questo:

     Menu menu = navigationView.getMenu(); menu.addSubMenu(" ").add(" "); 

    questo aggiungerà un divisore.

    basta essere sicuri di passare nell'indice destro quando si utilizza menu.getItem(int index)

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