2015-06-17 12 views
59

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

मैं यह नहीं समझ सकता कि किसी चयनित आइटम का रंग कैसे बदला जाए! यहाँ

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

    <item 
     android:id="@+id/navigation_item_2" 
     android:icon="@drawable/ic_2" 
     android:title="@string/navigation_item_2"/> 
</group> 

और navigationview एक्सएमएल जो एक android.support.v4.widget.DrawerLayout अंदर रखा जाता है है:

यहाँ मेनू के एक्सएमएल है

<android.support.design.widget.NavigationView 
    android:id="@+id/activity_main_navigationview" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    app:headerLayout="@layout/drawer_header" 
    app:itemIconTint="@color/black" 
    app:itemTextColor="@color/primary_text" 
    app:menu="@menu/menu_drawer"> 

    <TextView 
     android:id="@+id/main_activity_version" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     android:layout_marginBottom="@dimen/activity_vertical_margin" 
     android:layout_marginLeft="@dimen/activity_horizontal_margin" 
     android:textColor="@color/primary_text" /> 

</android.support.design.widget.NavigationView> 

आपकी मदद के लिए धन्यवाद!

[संपादित करें] मैं पहले से ही इस तरह के रूप यह एक समाधान पर ध्यान दिया है: Change background color of android menu

यह काफी हैक लगता है और मैंने सोचा कि नई डिजाइन समर्थन लाइब्रेरी के साथ, कुछ क्लीनर पेश किया गया होगा? NavigateItem स्थापित करने के लिए

+0

[एंड्रॉइड मेनू का पृष्ठभूमि रंग बदलें] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/2719173/change-background-color-of-android-menu) – jlopez

उत्तर

177

पर NavigationItemSelectedListener जोड़े वैसे आप इस Color State Resource का उपयोग कर प्राप्त कर सकते हैं। आप अपने NavigationView आप

app:itemIconTint="@color/black" 
app:itemTextColor="@color/primary_text" 

उपयोग कर रहे हैं यहाँ के बजाय @color/black या @color/primary_test का उपयोग कर के अंदर दिखाई देती है, एक Color State List Resource का उपयोग करें। इसके लिए, पहले color निर्देशिका के अंदर एक नया xml (उदा। Drawer_item.xml) बनाएं (जो res निर्देशिका के अंदर होना चाहिए।) यदि आपके पास पहले से color नामक निर्देशिका नहीं है, तो एक बनाएं।

अब drawer_item.xml अंदर इस

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:color="checked state color" android:state_checked="true" /> 
    <item android:color="your default color" /> 
</selector> 

अंतिम चरण की तरह कुछ करना होगा बदलने के लिए अपने NavigationView

<android.support.design.widget.NavigationView 
    android:id="@+id/activity_main_navigationview" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    app:headerLayout="@layout/drawer_header" 
    app:itemIconTint="@color/drawer_item" // notice here 
    app:itemTextColor="@color/drawer_item" // and here 
    app:itemBackground="@android:color/transparent"// and here for setting the background color to tranparent 
    app:menu="@menu/menu_drawer"> 

यह आप IconTint लिए अलग-अलग रंग राज्य सूची संसाधन का उपयोग कर सकते हैं, ItemTextColor, ItemBackground

अब जब आप किसी आइटम को चेक के रूप में सेट करते हैं (या तो xml या प्रोग्रामेटिक रूप से), तो विशेष आइटम में अनचेक किए गए लोगों की तुलना में अलग-अलग रंग होंगे।

public boolean onOptionsItemSelected(MenuItem item) { 

    int id = item.getItemId(); 

    item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 
     @Override 
     public boolean onMenuItemClick(MenuItem item) { 
      item.setEnabled(true); 
      item.setTitle(Html.fromHtml("<font color='#ff3824'>Settings</font>")); 
      return false; 
      } 
     }); 


    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

}

+0

याद रखें कि काम करने के लिए दबाए जाने के लिए आपको इसे एंड्रॉइड से बदलना होगा: state_checked android: state_pressed। आइटमबैकग्राउंड के लिए – Programista

+28

आपको रंग के बजाय ड्रॉ करने योग्य उपयोग करने की आवश्यकता है क्योंकि आप रंग संसाधन का उपयोग करके पृष्ठभूमि को परिभाषित नहीं कर सकते हैं। – sirFunkenstine

+0

@sash अगर हम चुनिंदा नेविगेशन आइटम पर परिवर्तन आइकन छवि करना चाहते हैं तो हम यह कैसे करेंगे? – mohit

2

एक जरूरत सच जाँच की जब भी NavigateView में आइटम

//listen for navigation events 
NavigationView navigationView = (NavigationView)findViewById(R.id.navigation); 
navigationView.setNavigationItemSelectedListener(this); 
// select the correct nav menu item 
navigationView.getMenu().findItem(mNavItemId).setChecked(true); 

क्लिक किया जाता है NavigationView

@Override 
    public boolean onNavigationItemSelected(final MenuItem menuItem) { 
    // update highlighted item in the navigation menu 
    menuItem.setChecked(true); 
    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() { 
     navigate(menuItem.getItemId()); 
     } 
    }, DRAWER_CLOSE_DELAY_MS); 
    return true; 
    } 
+0

आपकी सहायता विकलप के लिए धन्यवाद, लेकिन मैं हूं पहले से ही ऐसा कर रहा है ('सेट चेक (सत्य) ')। मैं चेक किए गए आइटम का रंग बदल रहा हूं लेकिन मैं इसे स्वयं संशोधित नहीं कर सकता, रंग हमेशा navigatioview पृष्ठभूमि का हल्का संस्करण है। – Greg

+0

@ ग्रेग डिफ़ॉल्ट रूप से 'दृश्य' पर सेट चेक (सत्य) 'उस डिवाइस तक पृष्ठभूमि रंग बदलता है जिस डिवाइस का आप उपयोग करते हैं। यदि आप आइटम की पृष्ठभूमि को किसी अन्य रंग में बदलना चाहते हैं तो आपको अपने लेआउट को 'ड्रॉवरलाउट' या 'नेविगेशन व्यू' में घुमाने और अपने आप को संभालने की आवश्यकता है। –

+0

फिर से धन्यवाद, मैंने जो कुछ कहा है उसे करने की कोशिश की है लेकिन सफलता के बिना, क्या आपके पास एक लिंक होगा जो कृपया बताएगा? – Greg

1

यहाँ एक और तरीका यह हासिल किया जा सके।

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
    <solid android:color="YOUR HIGHLIGHT COLOR"/> 
</shape> 

निम्नलिखित सामग्री के साथ एक और drawable फ़ाइल nav_item_drawable.xml करें::

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
     <item android:drawable="@drawable/highlight_color" android:state_checked="true"/> 
</selector> 

अंत में NavView में app:itemBackground टैग को जोड़ने के

निम्नलिखित सामग्री के साथ एक drawable फ़ाइल highlight_color.xml बनाओ: तो नीचे दिए गए चरणों का पालन करें:

<android.support.design.widget.NavigationView 
android:id="@+id/activity_main_navigationview" 
android:layout_width="wrap_content" 
android:layout_height="match_parent" 
android:layout_gravity="start" 
app:headerLayout="@layout/drawer_header" 
app:itemIconTint="@color/black" 
app:itemTextColor="@color/primary_text" 
app:itemBackground="@drawable/nav_item_drawable" 
app:menu="@menu/menu_drawer"> 

यहां light_color.xml फ़ाइल पृष्ठभूमि के लिए एक ठोस रंग को परिभाषित करता है। बाद में इस रंग को आकर्षित करने योग्य nav_item_drawable.xml चयनकर्ता को सौंपा गया है।

यह मेरे लिए काम किया। उम्मीद है कि यह मदद करेगा।

******************************* अद्यतन *******************************************

हालांकि जैसा कि ऊपर उल्लेख जवाब आप कुछ गुण से अधिक ठीक नियंत्रण देता है, लेकिन जिस तरह से मैं के बारे में वर्णन करने के लिए कर रहा हूँ अधिक ठोस लगता है और थोड़ा शीतक है।

तो आप क्या कर सकते, तो आप इस तरह NavigationView के लिए styles.xml में एक ThemeOverlay परिभाषित कर सकते हैं:

:

<style name="ThemeOverlay.AppCompat.navTheme"> 

     <!-- Color of text and icon when SELECTED --> 
     <item name="colorPrimary">@color/color_of_your_choice</item> 

     <!-- Background color when SELECTED --> 
     <item name="colorControlHighlight">@color/color_of_your_choice</item> 

    </style> 

अब NavigationView की app:theme विशेषता, इस तरह करने के लिए इस ThemeOverlay लागू

<android.support.design.widget.NavigationView 
android:id="@+id/activity_main_navigationview" 
android:layout_width="wrap_content" 
android:layout_height="match_parent" 
android:layout_gravity="start" 
app:theme="@style/ThemeOverlay.AppCompat.navTheme" 
app:headerLayout="@layout/drawer_header" 
app:menu="@menu/menu_drawer"> 

मुझे आशा है कि इससे मदद मिलेगी।

40

मेरा मानना ​​है कि app:itemBackground एक drawable की उम्मीद:

+1

इसके अलावा, इस विधि को रेडियोबटन, चेकबॉक्स, बटन इत्यादि जैसे अन्य विजेट्स के लिए 'एंड्रॉइड: पृष्ठभूमि = "@ ड्रायबल/nav_item_drawable" के रूप में उपयोग किया जा सकता है।' SetOnCheckedChangeListener 'को संभालने के लिए ब्लूटवेयर प्रोग्रामिंग को कम करता है। सिर्फ रंग हाइलाइटिंग के लिए। – rupinderjeet

+0

@ अंकुश यह काम करता है लेकिन टेक्स्ट और आइकन गायब हो जाता है, मैंने आइटम टिंट रंग भी सेट किया है लेकिन यह काम नहीं कर रहा है। क्या आप कृपया मुझे सुझाव दे सकते हैं कि यह कैसे किया जा सकता है – User

+0

@User मुझे नहीं पता कि आपके कोड में क्या गड़बड़ हुई है, लेकिन मैंने जवाब में जोड़ा है। कम प्रयास के साथ एक ही चीज़ को हासिल करने का एक बिल्कुल अलग तरीका। आप इसे देख सकते हैं। – Ankush

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