2015-06-11 15 views
6

मैंने हाल ही में समर्थन और डिज़ाइन नामक नवीनतम समर्थन लाइब्रेरी का उपयोग करने के लिए अपने एंड्रॉइड ऐप को परिवर्तित करना शुरू कर दिया है।एंड्रॉइड समर्थन: डिज़ाइन नेविगेशन दृश्य मेनू उप आइटम

नए नेविगेशन व्यू को लागू करते समय मैंने चयनित मेनू आइटम प्रदर्शित करने में समस्या पर ठोकर खाई है।

मेरे navdrawer_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<group android:checkableBehavior="single"> 
    <item 
     android:id="@+id/navigation_item_home" 
     android:icon="@drawable/ic_home_black" 
     android:title="@string/navdrawer_item_home" /> 
</group> 

    <item 
     android:id="@+id/navigation_subheader" 
     android:title="@string/navdrawer_subheader_title1"> 
     <menu> 
      <group android:checkableBehavior="single"> 
      <item 
       android:id="@+id/navigation_sub_item1" 
       android:icon="@drawable/ic_home_black" 
       android:title="@string/navdrawer_sub_item1" /> 
      </group> 
     </menu> 
    </item> 
</menu> 

अगला मैं मेनू के मद मेरी onNavigationItemSelected में जाँच करने के लिए सेट:

@Override 
public boolean onNavigationItemSelected(final MenuItem menuItem) { 

    menuItem.setChecked(true); 

    drawerLayout.closeDrawer(GravityCompat.START); 
    mDrawerActionHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      displayView(menuItem.getItemId()); 
     } 
    }, DRAWER_CLOSE_DELAY_MS); 
    return true; 
} 

यह अच्छा काम करता है अगर मैं केवल टैग के बीच सामान्य मेनू आइटम का उपयोग करें, लेकिन यह करता है उपशीर्षक के लिए बहुत अच्छी तरह से काम नहीं करते हैं। उप आइटमों पर क्लिक करने से उन्हें सेट नहीं किया जाएगा जब तक कि मैंने एक ही आइटम को दो बार क्लिक नहीं किया है और यह पहले से चेक किए गए किसी भी आइटम को अनचेक नहीं करेगा।

यह समाप्त होता है इस तरह लग रही:

enter image description here

+0

यह एक एंड्रॉइड समर्थन लाइब्रेरी बग है: https://code.google.com/p/android/issues/detail?id=175216 – sromku

उत्तर

3

मैं इस तरह से है कि बहुत अच्छी तरह से काम करता है में इस आवर्तक समस्या हल हो गई।

हमें बस चयनित आइटम की आईडी याद रखना चाहिए, अपने मेनू को अपने नेविगेशन व्यू पर रिचार्ज करना होगा और आइटम को फिर से चुनें।

है कि आप जिस तरह से की तरह अपने मेनू दराज की आवश्यकता के लिए

:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:id="@+id/section_1" 
     android:title="@string/section_title"> 

     <menu> 
      <group android:checkableBehavior="single"> 
       <item 
        android:id="@+id/item_1_section_1" 
        android:icon="@drawable/ic_icon" 
        android:title="@string/title"/> 

       <item 
        android:id="@+id/item_2_section_1" 
        android:icon="@drawable/ic_icon" 
        android:title="@string/title"/> 
       ... 
      </group> 
     </menu> 
    </item> 
     ... 
    <item 
     android:id="@+id/section_x" 
     android:title="@string/section_title"> 

     <menu> 
      <group android:checkableBehavior="single"> 
       <item 
        android:id="@+id/item_1_section_x" 
        android:icon="@drawable/ic_icon" 
        android:title="@string/title"/> 

       <item 
        android:id="@+id/item_2_section_x" 
        android:icon="@drawable/ic_icon" 
        android:title="@string/title"/> 
       ... 
      </group> 
     </menu> 
    </item> 
</menu> 

तो, मेरे समाधान:

public class YourActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { 

... 
private NavigationView mNavigationView; 
private int mNavItemId; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 

    // load saved navigation state if present 
    if (null == savedInstanceState) { 
     mNavItemId = R.id.item_1_section_1; 
    } else { 
     mNavItemId = savedInstanceState.getInt(NAV_ITEM_ID); 
    } 

    // listen for navigation events 
    mNavigationView = (NavigationView) findViewById(R.id.navigation_view); 
    mNavigationView.setNavigationItemSelectedListener(this); 

    // select the correct nav menu item 
    mNavigationView.getMenu().findItem(mNavItemId).setChecked(true); 
} 

@Override 
public boolean onNavigationItemSelected(final MenuItem menuItem) { 
    // update highlighted item in the navigation menu 
    mNavItemId = menuItem.getItemId(); 

    // allow some time after closing the drawer before performing real navigation 
    // so the user can see what is happening 
    mDrawerLayout.closeDrawer(GravityCompat.START); 
    mDrawerActionHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      ... 
     } 
    }, DRAWER_CLOSE_DELAY_MS); 

    // Reload menuDrawer to keep selected item 
    mNavigationView.getMenu().clear(); 
    mNavigationView.inflateMenu(R.menu.menu_drawer); 
    mNavigationView.getMenu().findItem(mNavItemId).setChecked(true); 

    return true; 
} 

... 

} 
+0

ऐसा लगता है कि यह काम करता है, लेकिन जब मैं ऐसा करता हूं, यह केवल मेनू के पहले समूह को लोड करेगा। कोई विचार? – orelzion

7

प्रत्येक आइटम एक समूह के अंदर होना चाहिए, ताकि समूह आइटम के नियंत्रित कर सकते हैं उपयोगकर्ता चयन पर दृश्य व्यवहार। इसे आज़माएं:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<group android:checkableBehavior="single"> 
    <item 
     android:id="@+id/navigation_item_home" 
     android:icon="@drawable/ic_home_black" 
     android:title="@string/navdrawer_item_home" /> 
    <item 
     android:id="@+id/navigation_subheader" 
     android:title="@string/navdrawer_subheader_title1"> 
     <menu> 
      <group android:checkableBehavior="single"> 
      <item 
       android:id="@+id/navigation_sub_item1" 
       android:icon="@drawable/ic_home_black" 
       android:title="@string/navdrawer_sub_item1" /> 
      </group> 
     </menu> 
    </item> 
</group> 
</menu> 
+0

@ जॉन वेंडेनबर्ग अगर इस या किसी भी उत्तर ने आपके प्रश्न को हल किया है तो कृपया चेक-मार्क पर क्लिक करके [इसे स्वीकार करना] (http://meta.stackexchange.com/q/5234/179419) पर विचार करें। यह व्यापक समुदाय को इंगित करता है कि आपको समाधान मिला है और उत्तर देने वाले और स्वयं दोनों को कुछ प्रतिष्ठा देता है।ऐसा करने का कोई दायित्व नहीं है। – Sufian

3

यह आसान है। बस एंड्रॉइड जोड़ें: प्रत्येक आइटम के लिए चेक करने योग्य = "सत्य"

उदाहरण के लिए।

<item 
     android:id="@+id/navigation_item_home" 
     android:icon="@drawable/ic_home_black" 
     android:title="@string/navdrawer_item_home" 
     android:checkable="true" /> 
1

मैं @MichelFortes द्वारा प्रदान की है क्योंकि यह NavigationView में सबमेनू आइटम के साथ मेरी समस्या हल समाधान को अपनाने के लिए सुझाव देते हैं। यह मेरा कोड है और यह काम करता

<group android:checkableBehavior="single"> 
    <item 
     android:id="@+id/your_id_item" 
     android:icon="@drawable/your_icon_if_you_want" 
     android:title="@string/title_for_this_item" /> 

    <!-- you can add here as many items as you want --> 

</group> 

<item 
    android:title="@string/submenu_title"> 
    <menu> 
     <group android:checkableBehavior="single"> 
      <item 
       android:id="@+id/submenu_item_id" 
       android:icon="@drawable/icon_if_exists" 
       android:title="@string/title_for_item" /> 

      <!-- you can add here as many items as you want --> 

     </group> 
    </menu> 
</item> 

यहाँ, प्रत्येक आइटम आप का चयन करें, यह जाँच की और हाइलाइट किया जाएगा! @MichelFortes को फिर से धन्यवाद;)

संबंधित मुद्दे