2015-06-03 2 views
8

Ich versuche, submenu Elemente zu NavigationView programmgesteuert hinzuzufügen. Ich bin in der Lage Elemente in menu hinzufügen, aber nicht in submenuWie programmatisch Untermenüpunkte zu NavigationView anstelle von Menü hinzufügen xml

Artikel zum Menü funktioniert Hinzufügen

Menu menu = mNavigationView.getMenu(); 
menu.add(Menu.NONE, Menu.NONE, index, "Menu Item1"); 

Aber das Hinzufügen von Elementen zu Untermenü funktioniert nicht

Menu menu = mNavigationView.getMenu(); 
SubMenu subMenu = menu.addSubMenu("Sub menu title"); 
subMenu.add(Menu.NONE, Menu.NONE, index, "SubMenu Item1"); 

Antwort

12

Der Trick, BaseAdapter.notifyDataSetChanged auf dem zugrunde liegenden Adapter aufzurufen, das die Menüelemente enthält. Sie können Reflektion verwenden, um die ListView oder einfach über die NavigationView Kinder zu greifen, bis Sie es erreichen.

Dies ist nicht der aktuellste Code, da ich weiß, dass Google die letzten Änderungen nicht an die Support-Bibliothek übertragen hat, aber im Wesentlichen NavigationMenuPresenter.prepareMenuItems aufgerufen wird, wenn Sie BaseAdpater.notifyDataSetChanged aufrufen.

Wenn Sie jedoch die neueste Quelle anzeigen möchten, können Sie sie über den SDK-Manager herunterladen. Wählen Sie Quellen für Android MNC. Dann navigieren Sie zu

yourAndroidSDK/sources/android-MNC/android/support/design/internal/NavigationMenuPresenter.java 

sources

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 
    final Menu menu = mNavigationView.getMenu(); 
    for (int i = 0; i < 4; i++) { 
     menu.add("Menu Item " + (i + 1)); 
    } 
    final SubMenu subMenu = menu.addSubMenu("SubMenu Title"); 
    for (int i = 0; i < 2; i++) { 
     subMenu.add("SubMenu Item " + (i + 1)); 
    } 
    for (int i = 0, count = mNavigationView.getChildCount(); i < count; i++) { 
     final View child = mNavigationView.getChildAt(i); 
     if (child != null && child instanceof ListView) { 
      final ListView menuView = (ListView) child; 
      final HeaderViewListAdapter adapter = (HeaderViewListAdapter) menuView.getAdapter(); 
      final BaseAdapter wrapped = (BaseAdapter) adapter.getWrappedAdapter(); 
      wrapped.notifyDataSetChanged(); 
     } 
    } 

} 

Ergebnisse

results

+1

Dank es funktioniert. Aber es sollte ein einfacher Weg sein, als die Listenansicht zu erhalten und zu aktualisieren. – Libin

+1

Ja, ich stimme zu. Und ich stelle mir vor, dass solche Dinge mit fortschreitender Entwicklung der neuen Design-Bibliothek etwas reibungsloser ablaufen werden. Froh, dass es für dich funktioniert. – adneal

+1

Was ist mit dem Hinzufügen von Untermenü ohne Titel? Es ist Platz da! Könnte ein Problem sein! –

Verwandte Themen