2015-06-03 5 views
8

के बजाय प्रोग्रामिंग के रूप में NavigationView में उपमेनू आइटम कैसे जोड़ें I submenu आइटम NavigationView प्रोग्रामेटिक रूप से जोड़ने की कोशिश कर रहा हूं। मैं काम करता है लेकिन submenuमेनू xml

मेनू में आइटम जोड़ने में menu में आइटम जोड़ने के लिए कर सकती हूं

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

लेकिन उप मेनू में आइटम डाले

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

उत्तर

12

अंतर्निहित Adapter पर मेनू आइटम वाले BaseAdapter.notifyDataSetChanged पर कॉल करने की चाल। आप ListView को पकड़ने के लिए प्रतिबिंब का उपयोग कर सकते हैं या NavigationView बच्चों तक पहुंचने तक केवल लूप का उपयोग कर सकते हैं।

यह सबसे अद्यतित कोड नहीं है, क्योंकि मुझे पता है कि Google ने समर्थन लाइब्रेरी में हालिया परिवर्तनों को धक्का नहीं दिया है, लेकिन अनिवार्य रूप से NavigationMenuPresenter.prepareMenuItems को कॉल किया जाता है जब आप BaseAdpater.notifyDataSetChanged पर कॉल करते हैं।

लेकिन यदि आप सबसे हालिया स्रोत देखना चाहते हैं, तो आप इसे एसडीके प्रबंधक के माध्यम से डाउनलोड कर सकते हैं। एंड्रॉइड एमएनसी के लिए स्रोत चुनें। तब के

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

} 

परिणाम

results

+1

धन्यवाद यह काम करता है नेविगेट। लेकिन सूची दृश्य और ताज़ा करने से यह एक आसान तरीका होना चाहिए। – Libin

+1

हाँ, मैं सहमत हूं। और मुझे लगता है कि इस तरह की चीजें थोड़ा आसान हो जाएंगी क्योंकि नई डिज़ाइन लाइब्रेरी प्रगति करती है। खुशी है कि यह आपके लिए काम करता है हालांकि। – adneal

+1

शीर्षक के बिना सबमेनू जोड़ने के बारे में क्या? यह वहां जगह छोड़ रहा है! एक मुद्दा हो सकता है! –

1

किसी ने पता लगा एक काम नहीं करता है प्रतिबिंब और एक निजी क्षेत्र तक पहुंचने के माध्यम से इसे करने का तरीका। यह सुंदर नहीं है, लेकिन इस पल के लिए, यह काम करेगा। https://stackoverflow.com/a/30604299/4232051