TextView की पृष्ठभूमि के रंग पर चयनकर्ता


121

TextViewजब उपयोगकर्ता इसे छूता है तो मैं एंड्रॉइड विजेट की पृष्ठभूमि का रंग बदलने का प्रयास कर रहा हूं । मैंने उस उद्देश्य के लिए एक चयनकर्ता बनाया है, जो इसमें संग्रहीत है res/color/selector.xmlऔर मोटे तौर पर ऐसा दिखता है:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:color="@color/semitransparent_white"
        />
    <item
        android:color="@color/transparent"
        />
</selector>

clickableकी विशेषता TextViewहै trueमामले ब्याज की है कि में,।

जब मैं इस चयनकर्ता को एक के TextViewरूप में असाइन करता android:background="@color/selector"हूं, तो मुझे रनटाइम पर निम्न अपवाद मिल रहा है:

ERROR / AndroidRuntime (13130): इसके कारण: org.xmlpull.v1.XmlPullParserException: बाइनरी एक्सएमएल फाइल लाइन # 6: टैग के लिए एक ड्रॉ करने योग्य 'ड्रॉबल' विशेषता या चाइल्ड टैग की आवश्यकता होती है

जब मैं विशेषता को ड्रा करने योग्य बनाता हूं, तो यह काम करता है, लेकिन परिणाम पूरी तरह से गलत दिख रहा है क्योंकि आईडी को रंग संदर्भों के बजाय छवि संदर्भों के रूप में व्याख्या किया गया है (जैसा कि "ड्रॉबल" बताता है)।

जो मुझे भ्रमित करता है वह यह है कि मैं एक रंगीन संदर्भ सेट कर सकता हूं, उदाहरण के लिए "@ रंग / काला", सीधे पृष्ठभूमि विशेषता के रूप में। यह उम्मीद के मुताबिक काम कर रहा है। चयनकर्ताओं का उपयोग करना काम नहीं करता है।

मैं चयनकर्ता का उपयोग textColorबिना किसी समस्या के भी कर सकता हूं ।

TextViewएंड्रॉइड में पृष्ठभूमि-रंग-चयनकर्ता को लागू करने का सही तरीका क्या है?


एक रंग को एक ड्रॉबल के रूप में व्याख्या किया जा सकता है। परिणाम वास्तव में गलत कैसे है?
रोमेन गाइ

यह रंग नहीं दिखा रहा है, बल्कि पृष्ठभूमि के रूप में मेरे आकर्षित करने योग्य संसाधनों से एक छवि दिखा रहा है।
digitalbreed

2
उपरोक्त कार्य करना चाहिए, यदि आप Android: drawable, not android: color - का उपयोग करते हैं तो कम से कम उस स्थिति में यह मेरे लिए काम करता है: android: drawable = "@ color / my_custom_color"। मेरे रंग मूल्यों / रंगों में परिभाषित किए गए हैं।
xml

जवाबों:


226

यहां समस्या यह है कि आप एक रंग चयनकर्ता का उपयोग करके पृष्ठभूमि के रंग को परिभाषित नहीं कर सकते हैं, आपको एक चयन योग्य चयनकर्ता की आवश्यकता है । इसलिए, आवश्यक परिवर्तन इस तरह दिखाई देंगे:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:drawable="@drawable/selected_state" />
</selector>

आपको उस संसाधन को drawableनिर्देशिका में स्थानांतरित करने की भी आवश्यकता होगी जहां यह अधिक समझ में आता है क्योंकि यह प्रति रंग चयनकर्ता नहीं है।

फिर आपको res/drawable/selected_state.xmlफ़ाइल को इस तरह बनाना होगा :

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle">
    <solid android:color="@color/semitransparent_white" />
</shape>

और अंत में, आप इसे इस तरह उपयोग करेंगे:

android:background="@drawable/selector"

नोट : ओपी को एक छवि संसाधन क्यों प्राप्त हो रहा था, इसका कारण शायद यह है कि उसने अपने संसाधन का संदर्भ देने की कोशिश की थी जो अभी भी रंग निर्देशिका में था, लेकिन इसका उपयोग करते हुए @drawableवह आईडी टकराव के साथ समाप्त हो गया, गलत संसाधन का चयन किया।

आशा है कि यह अभी भी किसी की मदद कर सकता है, भले ही ओपी ने शायद मुझे उम्मीद है, अब तक उसकी समस्या हल कर दी है।


1
धन्यवाद, बेनोइट। समस्या हल हो गई (मुझे स्वीकार करना चाहिए, मुझे याद नहीं है कि मैंने इसे आखिर में कैसे किया था) और परियोजना सफलतापूर्वक समाप्त हो गई थी। मैं इस बात की सराहना करता हूं कि आप भविष्य में इसी समस्या से जूझने वाले लोगों की मदद करने के लिए वापस आए, महान आत्मा!
डिजिटल

मैं यह काम नहीं कर सकता। मैं इसे एक बटन पर लागू करने की कोशिश कर रहा हूं और यह पृष्ठभूमि को चयनकर्ता के डिफ़ॉल्ट रंग पर सेट करता है, लेकिन यह स्टेट_प्रेस्ड में परिभाषित आकार में नहीं बदलता है। मुझे क्या याद आ रही है? मैं एक नया प्रश्न खोल सकता हूं, बस अगर आप मुझे सही दिशा में इंगित कर सकते हैं।
Maragues

@Maragues बिना किसी कोड को देखे इसे बता पाना मुश्किल है। मेरा सुझाव है कि आप एक नया प्रश्न खोलें और संबंधित कोड पोस्ट करें ताकि हम यह पता लगा सकें कि क्या गलत हो सकता है। आप इस पोस्ट में अपनी नई पोस्ट के लिंक के साथ एक टिप्पणी भी जोड़ सकते हैं।
बेनोइट मार्टिन

9
इसके बजाय सीधे अपने चयनकर्ता आइटमों में "ड्रॉएबल =" @ रंग / your_color "का उपयोग क्यों न करें? आपको किसी भी आकार या किसी भी अन्य फ़ाइल को परिभाषित करने की आवश्यकता नहीं है, बस आपके रंग की परिभाषाएँ मानों में है / color.xml (यह हमेशा अच्छा होता है) रंगों के लिए नहीं)।
जावेदियन

काम नहीं कर रहा। इसका मुझे अलग-अलग रंग दिखा रहा है, जैसा कि मैंने आकार xml के रूप में घोषित किया है।
एर.रोहित शर्मा

121

बेनोइट का समाधान काम करता है, लेकिन आपको वास्तव में एक आकृति बनाने के लिए ओवरहेड को उकसाने की आवश्यकता नहीं है। चूँकि रंग आरेखित हो सकते हैं, बस एक रंग को /res/values/colors.xml फ़ाइल में परिभाषित करें:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="semitransparent_white">#77ffffff</color>
</resources>

और फिर अपने चयनकर्ता में इस तरह का उपयोग करें:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:drawable="@color/semitransparent_white" />
</selector>

किसी कारण से, आपका समाधान रंग नहीं दिखा रहा है, लेकिन मेरे ड्रॉबल रिसोर्स फ़ोल्डर से एक यादृच्छिक छवि है। मैंने प्रोजेक्ट को ठीक करने / संपत्तियों को ठीक करने / फिर से खोलने / फिर से खोलने की कोशिश की क्योंकि यह वास्तव में अजीब लगता है, लेकिन कोई फायदा नहीं हुआ। अजीब।
येलहेल

@ येल आपने संभवतः रंग ड्रा करने योग्य संसाधन को वास्तविक ड्रा करने योग्य फ़ाइल के रूप में नाम दिया है?
जोना

@ जोना: नहींं, लेकिन ड्रॉबल को बैकग्राउंड_प्लेसमेंट नाम दिया गया था और कलर ड्रॉएबल को बैकग्राउंड_व्हाइट_ट्रांसपैरेंट नाम दिया गया था। दोनों में पृष्ठभूमि थी ... मैंने कुछ अन्य धागे पर वही देखा है जो दूसरों के साथ होता है इसलिए मैंने दायर किया कि कई एंड्रॉइड बग में से एक के रूप में और इसे पूरा करने के लिए मेरे पूरे लेआउट को नया रूप दिया।
येल

@ येल मैम ... वैसे मैं उस मुद्दे को देखता हूं लेकिन मेरे मामले में एक ही फाइल के नाम नहीं हैं ... मेरे सवालों की जांच यहां करें stackoverflow.com/questions/9004744/…
जोना

यह काम करने का प्रबंधन नहीं किया, बेनोइट मार्टिन के जवाब ने ठीक काम किया।
इमैनुएल टौजरी

83

उपरोक्त के लिए एक सरल उपाय:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <color android:color="@color/semitransparent_white" />
    </item>
    <item>
        <color android:color="@color/transparent" />
    </item>
</selector>

ड्रा करने योग्य फ़ोल्डर में सहेजें और आप जाने के लिए अच्छे हैं।


1
शायद यह काम करता है, लेकिन आधिकारिक तौर पर समर्थित नहीं है (एंड्रॉइड स्टूडियो इसे एक त्रुटि के रूप में मानता है)।
ब्लैकहेक्स

@ ब्लेकहैक्स स्ट्रेंज। ग्रहण में मेरे लिए ठीक काम करता है। यह शायद एक लिंट त्रुटि है, और यदि यह है, तो आपको इसे अक्षम या अनदेखा करने में सक्षम होना चाहिए।
जेसन रॉबिन्सन

6
यही मैं समाधान पर विचार करूंगा।
गोंज़ालेज़

<item android:state_pressed="true" android:color="@color/vantablack"/>करने के लिए अर्थ की दृष्टि से हूबहू लग रहा है<item android:state_pressed="true"><color android:color="@color/vantablack"/></item>
Samis

16

यहां तक ​​कि यह काम करता है।

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@color/dim_orange_btn_pressed" />
    <item android:state_focused="true" android:drawable="@color/dim_orange_btn_pressed" />
    <item android:drawable="@android:color/white" />
</selector>

मैंने android:drawableप्रत्येक आइटम में विशेषता जोड़ी , और उनके मूल्य रंग हैं।

वैसे, वे क्यों कहते हैं कि colorइसकी विशेषताओं में से एक है selector? वे लिखते हैं कि android:drawableआवश्यक नहीं है।

रंग राज्य सूची संसाधन

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:color="hex_color"
        android:state_pressed=["true" | "false"]
        android:state_focused=["true" | "false"]
        android:state_selected=["true" | "false"]
        android:state_checkable=["true" | "false"]
        android:state_checked=["true" | "false"]
        android:state_enabled=["true" | "false"]
        android:state_window_focused=["true" | "false"] />
</selector>

रंग विशेषता तब काम करती है जब आप टेक्स्टव्यू रंगों पर सेट कर रहे होते हैं, लेकिन पृष्ठभूमि के साथ नहीं होते हैं, क्योंकि वास्तव में बैकग्राउंड पर रंग ColorDrawable के रूप में काम किए जाते हैं
अखिल पिता

उपरोक्त सभी को लागू करने के लिए सबसे अच्छा और आसान समाधान।
4gus71n

6

जो पृष्ठभूमि क्षेत्र बनाए बिना इसे करने के लिए खोज कर रहा है, बस उन पंक्तियों को इसमें जोड़ें TextView

android:background="?android:attr/selectableItemBackground"
android:clickable="true"

यह भी चयन करने योग्य उपयोग करने के लिए:

android:textIsSelectable="true"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.