2015-06-26 5 views
8

Ich habe dieses Layout:Dynamische Menüs 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"/> 

Also, auf der Suche, dass in NavigationView haben wir das Attribut:

app:menu="@menu/drawer_menu" 

Und ich habe eine dieser XML-ID Menü-Ordner .

Ich möchte Dinamicament Menüs machen, dh, in Code sollte ich die 'MenuItem' Objekte montieren und in NavigationView setzen.

Das ist richtig? Das ist beste Praxis? Dies ist möglich?

Hinweis: Mein Code arbeitet mit static drawer_menu, ich möchte es verbessern.

Ich warte.

[EDIT]

Ich mache es:

06-27 15: 26: 15,538 15335-15335/

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()); 
     } 

Aber dieser Fehler ist passiert? E/AndroidRuntime: FATALE AUSNAHME: Haupt Prozess: com.example.sticdev30.newdrawer, PID: 15335 java.lang.RuntimeException: kann Aktivität nicht starten ComponentInfo {com.example.sticdev30.newdrawer/com.example.sticdev30.newdrawer .MainActivity}: android.content.res.Resources $ NotFoundException: String Ressource ID # 0x1

KSMenuItem ist ein POJO mit meinen Menüdaten. In kmi.id informierte ich inkrementale ganze Zahlen ...

Ich waitning

+1

Kasse meine Antwort hier: http: //stackoverflow.com/a/30706233/3544839 – Moinkhan

+1

Bitte, siehe meine Bearbeitung. –

Antwort

1

Scheint, wie kmi.getId() kehrt int (oder long).

Aber Menu.add(int) fügt Menü mit Titel aus den angegebenen Zeichenfolge Ressourcen, die normalerweise als R.string.something dargestellt wird, und nicht für die üblichen Ganzzahlwerte.

Menu.add(CharSequence) fügt Menü mit Titel CharSequence, so müssen Sie Konvertierung einige int-to-String tun, wie menu.add(kmi.getId() + "");

11

Sie Menüs hinzufügen können dynamisch durch folgende Schritte:

Schritt 1. Rufen Sie das Menüobjekt aus der Navigationsansicht NavigationView.getMenu()

Schritt2. Fügen Sie ein beliebiges Element in das Menü mit Menu.add()

+0

Bitte sehen Sie meine Bearbeitung. –

+0

Die Methode [Menu.add (int)] (http://developer.android.com/reference/android/view/Menu.html#add (int)) erwartet eine Zeichenfolge-Ressourcen-ID. Von den Protokollen der fünften Zeile wird gesagt, dass die Ressource (String ressource) nicht gefunden wurde. –

30

Sie können NavigationView zur Laufzeit mit 2 Zeilen Code mit öffentlichen Methode inflateMenu wieder aufzublasen.In diesem Beispiel i mit new_navigation_drawer_items.xml wieder aufblasen

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

Wir können dynamisch Menüpunkte hinzufügen/entfernen. Angenommen, wir

<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 Aktivität dieses Menüpunkte` haben wir menuitems basieren auf unseren Zustand

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 
    } 


} 

es Hoffnung wird dazu beitragen, hinzufügen oder entfernen.