2015-06-26 23 views
8

ho questo Disposizione:menu dinamici in NavigationView

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <!-- The ActionBar --> 
    <include 
     layout="@layout/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <!-- The main content view --> 
    <FrameLayout 
     android:id="@+id/flContent" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</LinearLayout> 

<!-- The navigation drawer --> 
<android.support.design.widget.NavigationView 
    android:id="@+id/nvView" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:background="@android:color/white" 
    app:menu="@menu/drawer_menu" 
    app:headerLayout="@layout/nav_header"/> 

Così, guardando che in NavigationView abbiamo l'attributo:

app:menu="@menu/drawer_menu" 

e ho una cartella di questo menu id XML .

Voglio fare i menu dinamicament, cioè, nel codice dovrei montare gli oggetti "MenuItem" e impostare su NavigationView.

Questo è corretto? Questa è la soluzione migliore? Questo è possibile?

Nota: il mio codice funziona con static drawer_menu, voglio migliorarlo.

Sto aspettando.

[EDIT]

faccio:

Menu menu = nvDrawer.getMenu(); 
     for (KSMenuItem kmi : menus.values()) { 
      if (menu.size() == 0) { 
       menu.add(kmi.getId()); 
      } 
      if (menu.getItem(kmi.getId()) == null) { 
       menu.add(kmi.getId()); 
      } 
      MenuItem mi = menu.getItem(kmi.getId()); 
      mi.setIcon(kmi.getIcon()); 
      mi.setTitle(kmi.getTittle()); 
     } 

Ma questo errore è accaduto:

06-27 15: 26: 15,538 15.335-15.335 /? E/AndroidRuntime: FATAL EXCEPTION: main Processo: com.example.sticdev30.newdrawer, PID: 15335 java.lang.RuntimeException: impossibile avviare l'attività ComponentInfo {com.example.sticdev30.newdrawer/com.example.sticdev30.newdrawer .MainActivity}: android.content.res.Resources $ NotFoundException: stringa di risorsa ID # 0x1

KSMenuItem è un POJO con i miei dati del menu. In kmi.id Ho informato interi incrementali ...

sto waitning

+1

checkout la mia risposta qui: http: //stackoverflow.com/a/30706233/3544839 – Moinkhan

+1

Per favore, vedere la mia modifica. –

risposta

1

Sembra kmi.getId() restituisce int (o long).

Ma Menu.add(int) aggiunge il menu con il titolo dalle risorse stringa specificate, che in genere è rappresentato come R.string.something e non per i valori interi normali.

Menu.add(CharSequence) fa aggiuntivo di menu con il titolo di CharSequence, quindi è necessario fare un po 'di conversione int-to-stringa come menu.add(kmi.getId() + "");

11

È possibile aggiungere i menu in modo dinamico dalla seguenti fasi:

Step1. Ottieni oggetto menu da Navigation View NavigationView.getMenu()

Step2. Aggiungi qualsiasi elemento al menu utilizzando Menu.add()

+0

Vedi la mia modifica. –

+0

Il metodo [Menu.add (int)] (http://developer.android.com/reference/android/view/Menu.html#add (int)) prevede un ID risorsa stringa. Dai log alla quinta riga si dice che la risorsa (risorsa String) non è stata trovata. –

30

È possibile rigonfiare NavigationView in fase di esecuzione con 2 righe di codice utilizzando il metodo pubblico inflateMenu.In questo esempio i rigonfiare con new_navigation_drawer_items.xml

navigationView.getMenu().clear(); //clear old inflated items. 
navigationView.inflateMenu(R.menu.new_navigation_drawer_items); //inflate new items. 
2

Possiamo dinamicamente aggiungere/rimuovere le voci di menu. Supponiamo di avere questo voci di menu `

<group android:checkableBehavior="single"> 
    <item 
     android:id="@+id/nav_home" 
     android:icon="@mipmap/home_icon_x48" 
     android:title="Home" /> 
    <item 
     android:id="@+id/nav_part_catalouge" 
     android:icon="@mipmap/catalogue_icon_x48" 
     android:title="Parts Catalogue" /> 
    <item 
     android:id="@+id/nav_favourite" 
     android:icon="@mipmap/my_favourate_x48" 
     android:title="My-Favourite" />\ 
    <item 
     android:id="@+id/nav_opencarrequest" 
     android:icon="@mipmap/cart_request" 
     android:title="Cart-Request" /> 

    <item 
     android:id="@+id/nav_setting" 
     android:icon="@mipmap/settings_x48" 
     android:title="Settings" /> 
</group> 


<item android:title=""> 
    <menu> 
     <item 
      android:id="@+id/nav_logout" 
      android:icon="@mipmap/logout_icon_x48" 
      android:title="Logout" /> 
    </menu> 
</item> 

`

In attività siamo in grado di aggiungere o rimuovere menuitems sulla base della nostra condizione

protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);// your activity layout here 
    NavigationView navigationView= (NavigationView) findViewById(R.id.nav_view); // navigation view which holds menu items 
    navigationView.setNavigationItemSelectedListener(this); 
    if(yourCondition){ 
      navigationView.getMenu().getItem(0).setVisible(false); //if you want to hide first item 
      navigationView.getMenu().getItem(1).setVisible(true); // if you want to show second menu item should be visible 
    } 


} 

speranza che sarà di aiuto.

Problemi correlati