2016-04-11 32 views
5

Ho un cassetto di navigazione standard, pre-creato da Android Studio e voglio popolarlo con il numero di gruppi. Ho iniziato con questo:Cassetto di navigazione: aggiungi titoli ai gruppi, non articoli

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

    <group android:checkableBehavior="single"> 
     <item 
      android:id="@+id/nav_mode_person" 
      android:icon="@drawable/ic_person_black_24dp" 
      android:title="Person" /> 
     <item 
      android:id="@+id/nav_mode_group" 
      android:icon="@drawable/ic_group_black_24dp" 
      android:title="Community" /> 
    </group> 

    <item android:title="Communicate"> 
     <menu> 
      <item 
       android:id="@+id/nav_share" 
       android:icon="@drawable/ic_menu_share" 
       android:title="Share" /> 
      <item 
       android:id="@+id/nav_send" 
       android:icon="@drawable/ic_menu_send" 
       android:title="Send" /> 
     </menu> 
    </item> 

</menu> 

Ma quello che non ho ottenuto è se è anche possibile assegnare a ciascun gruppo un titolo? Voglio dire che c'è un'opzione android:title disponibile per <item> s, ma non è disponibile per <group> se, se provo a racchiudere gruppi attorno agli elementi, ciò che ottengo è un comportamento di voci disordinato.

Ho letto le linee guida di progettazione di Google su Navigation Drawer, ma ho mancato il punto se i gruppi dovessero avere il proprio nome o non dovrebbero. Ecco una foto di quello che voglio raggiungere:

enter image description here

E 'possibile senza l'aggiunta di casuali <TextView> s? A proposito, voglio farlo tramite XML, non a livello di codice.

+0

hai dimenticato l'immagine? – uguboz

+0

No, è lì. – TranslucentCloud

+1

Possibile duplicato di [Intestazione del gruppo di navigazione-cassetto - come configurare?] (Http://stackoverflow.com/questions/31678302/navigation-drawer-group-header-how-to-set-up) – yennsarah

risposta

4

Qui è ben definito come creare menu.

http://developer.android.com/guide/topics/ui/menus.html

Quindi nel tuo caso creare la vostra lista in questo ordine item-> menu-> gruppo. Vale a dire:

<item android:title="Title"> 
    <menu> 
     <group android:checkableBehavior="single"> 
      <item android:id="@+id/nav_share" 
       android:icon="@drawable/ic_menu_share" 
       android:title="Share" /> 
      <item 
       android:id="@+id/nav_send" 
       android:icon="@drawable/ic_menu_send" 
       android:title="Send" /> 
       . . . 
       . . . 
+0

Lo stesso problema che ho descritto nel commento alla risposta di @Saenic. – TranslucentCloud

+0

grazie mille, questo è quello che voglio .. –

12

Hai ragione, non è possibile assegnare un titolo ai gruppi. L'unica opzione sembra essere quella di avvolgere gruppi in <item> e <menu> tag come questo

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

    <item android:title="General"> 
     <menu> 
      <group android:checkableBehavior="single"> 
       <item 
        android:id="@+id/nav_camera" 
        android:icon="@drawable/ic_menu_camera" 
        android:title="Import" /> 
       <item 
        android:id="@+id/nav_gallery" 
        android:icon="@drawable/ic_menu_gallery" 
        android:title="Gallery" /> 
      </group> 
     </menu> 
    </item> 

    <item android:title="Communicate"> 
     <menu> 
      <item 
       android:id="@+id/nav_share" 
       android:icon="@drawable/ic_menu_share" 
       android:title="Share" /> 
      <item 
       android:id="@+id/nav_send" 
       android:icon="@drawable/ic_menu_send" 
       android:title="Send" /> 
     </menu> 
    </item> 

</menu> 

risultante in un menu cassetto di navigazione come questo

Navigation Drawer

+0

L'ho provato ma sfortunatamente le cose si complicano se provi a controllare qualche elemento in modo programmatico al momento della creazione dell'attività. Quando si imposta l'opzione pre-selezionata in questo modo (ad esempio "Importa"), se l'utente tocca un elemento diverso ('Gallery'), il primo rimane selezionato.L'utente dovrebbe inoltre toccare "Importa" e "Galleria" più volte per ottenere la prima voce deselezionata. Questo è il motivo per cui ho respinto questa soluzione alternativa. – TranslucentCloud

+0

Inizialmente non avevi scritto su questo, quindi non ho motivo di sviare la mia risposta. Se i gruppi 'checkableBehavior' non funzionano per te, allora devi farlo a livello di programmazione. Controlla l'elemento 'selezionato' e deseleziona tutti gli altri sulla creazione di attività e su ogni elemento clicca. – Saenic

+0

In realtà l'ho scritto, ma non nei dettagli: "Se provo a racchiudere gruppi attorno agli oggetti, quello che ottengo è un comportamento disordinato delle voci". Il downvote è legittimo, poiché la tua risposta lo ignora totalmente. – TranslucentCloud

0

Aggiungi classe xml navigation_drawer_title:

<?xml version="1.0" encoding="utf-8"?> 
<TextView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="wrap_content" 
     android:text="communicate" 
     android:layout_height="wrap_content"/> 

e cambia il tuo navigationAdapter in questo modo

private static final int TYPE_HEADER = 0; 
    private static final int TYPE_ITEM = 1; 
    private static final int TYPE_SEPARATOR = 2; 
    private static final int TYPE_TITLE = 3; 
    @Override 
     public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
     { 
      View v = null; 
      switch (viewType) 
      { 
       case TYPE_HEADER: 
        v = LayoutInflater.from(parent.getContext()).inflate(R.layout.navigation_drawer_header, parent, false); //Inflating the layout 
        break; 
       case TYPE_ITEM: 
        v = LayoutInflater.from(parent.getContext()).inflate(R.layout.navigation_drawer_item, parent, false); //Inflating the layout 
        break; 
       case TYPE_SEPARATOR: 
        v = LayoutInflater.from(parent.getContext()).inflate(R.layout.navigation_drawer_separator, parent, false); //Inflating the layout 
        break; 

       case TYPE_TITLE: 
        v = LayoutInflater.from(parent.getContext()).inflate(R.layout.navigation_drawer_title, parent, false); //Inflating the layout 
        break; 
      } 
      return new ViewHolder(v, viewType); // Returning the created object 

     } 

e

@Override 
    public int getItemViewType(int position) 
    { 
     if (position == 0) 
      return TYPE_HEADER; 
     if (navMenuItems.get(position - 1).getItemType() == NavItemType.Group) 
      return TYPE_SEPARATOR; 
     if (navMenuItems.get(position - 2).getItemType() == NavItemType.Group) 
      return TYPE_TITLE 

     return TYPE_ITEM; 
    } 
+0

Ho affermato nella mia domanda, che non voglio provare a risolvere questo programmaticamente. – TranslucentCloud

+0

non ne ho idea. Ho appena fatto in adattatore. –

1

È inoltre tenuti ad avere un gruppo esterno con android:checkableBehavior="single" in modo che non ci sono due elemento è selezionato uno da First Category e altri da Second Category. Ecco il codice funzionante.

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<group android:checkableBehavior="single"> 
<item 
    android:title="First Category"> 
    <menu> 
     <group 
      android:id="@+id/menu_top" 
      android:checkableBehavior="single"> 
      <item 
       android:id="@+id/id1" 
       android:icon="@drawable/drawable1" 
       android:title="Title1" /> 

      <item 
       android:id="@+id/id2" 
       android:icon="@drawable/drawable2" 
       android:title="Title2" /> 
     </group> 
    </menu> 
</item> 
<item 
    android:title="Second Category"> 
    <menu> 
     <group 
      android:id="@+id/menu_bottom" 
      android:checkableBehavior="single"> 
      <item 
       android:id="@+id/id3" 
       android:icon="@drawable/drawable3" 
       android:title="Title3" /> 

      <item 
       android:id="@+id/id4" 
       android:icon="@drawable/drawable4" 
       android:title="Title4" /> 
     </group> 
    </menu> 
</item> 
</group> 
</menu>