कैसे एक drawable से शैली विशेषताएँ संदर्भ के लिए?


96

मैं अपने आवेदन के लिए 2 चयन योग्य विषय रखना चाहता हूं। ऐसा करने के लिए, मैंने कुछ विशेषताओं को परिभाषित किया, जैसे:

 <attr format="color" name="item_background" />

फिर, मैंने दोनों थीम बनाई, जैसे:

  <style name="ThemeA">
     <item name="item_background">#123456</item>
 </style>

 <style name="ThemeB">
     <item name="item_background">#ABCDEF</item>
 </style>

यह विधि महान काम करती है, जिससे मुझे कई थीम आसानी से बनाने और संशोधित करने की अनुमति मिलती है। समस्या यह है कि ऐसा लगता है कि इसका उपयोग केवल Views में ही किया जा सकता है, न कि Drawables में

उदाहरण के लिए, एक लेआउट के अंदर एक दृश्य से एक मूल्य का संदर्भ देते हुए काम करता है:

 <TextView android:background="?item_background" />

लेकिन एक ड्रा करने योग्य में ही कर रहा है:

 <shape android:shape="rectangle">
     <solid android:color="?item_background" />
 </shape>

एप्लिकेशन चलाते समय मुझे यह त्रुटि मिलती है:

    java.lang.UnsupportedOperationException: Can't convert to color: type=0x2

अगर इसके बजाय ?item_backgroundमैं हार्डकोड कलर का उपयोग करता हूं, तो यह काम करता है, लेकिन यह मुझे अपने विषयों का उपयोग करने की अनुमति नहीं देता है। मैंने भी कोशिश की ?attr:item_background, लेकिन ऐसा ही होता है।

मैं ये कैसे करूं? और यह व्यूज में क्यों नहीं बल्कि ड्रॉबल्स में काम करता है? मैं इस सीमा को प्रलेखन में कहीं भी नहीं ढूँढ सकता ...


यह निम्नलिखित प्रश्न का एक डुप्लिकेट हो सकता है: stackoverflow.com/questions/7529574/…
पॉल लाम्मर्ट्स्मा

@ मर्टिन एम।, आपने इसके साथ क्या किया?
user123321

उस के लिए कोई समाधान अभी तक? मैं ठीक उसी दीवार से टकराने कर रहा हूँ
Guillaume

यहाँ एक और हालिया प्रश्न: stackoverflow.com/q/12115125/317889 समान समस्या। इसे Google पर क्रमित करें।
HGPB

3
जाहिरा तौर पर यह मुद्दा एंड्रॉइड एल पूर्वावलोकन में हल किया गया था, जैसा कि यहां निर्दिष्ट किया गया है: code.google.com/p/android/issues/detail?id=26251
Bianca Daniciuc

जवाबों:


161

मेरे अनुभव में एक्सएमएल ड्रॉबल में एक विशेषता को संदर्भित करना संभव नहीं है।
अपनी थीम बनाने के लिए आपको निम्न की आवश्यकता है:

  • प्रति विषय एक एक्सएमएल ड्रा करने योग्य बनाएं।
  • @colorटैग या # आरजीबी प्रारूप के साथ सीधे आकर्षित करने योग्य आवश्यक रंग शामिल करें ।

Attrs.xml में अपने drawable के लिए एक विशेषता बनाओ ।

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <!-- Attributes must be lowercase as we want to use them for drawables -->
   <attr name="my_drawable" format="reference" />
</resources>

अपनी theme.xml में अपनी drawable जोड़ें ।

<style name="MyTheme" parent="@android:style/Theme.NoTitleBar">
   <item name="my_drawable">@drawable/my_drawable</item>
</style>

अपनी विशेषता का उपयोग करके अपने लेआउट में अपने योग्‍य का संदर्भ दें।

<TextView android:background="?my_drawable" />

20
ऐसा लगता है कि, यह समाधान अभी भी आवश्यक है यदि आप संगतता रखना चाहते हैं ... हां एल से यह तय हो गया है और थीम रंग को अच्छी तरह से संदर्भित किया गया है, लेकिन एक ही कोड विभिन्न प्री-एल उपकरणों पर चलता है और वास्तव में एटीआर संदर्भ काम नहीं करता है पूर्व एल उपकरणों! LoL .. तो मेरे लिए यह तय नहीं है अगर मुझे वैसे भी अलग-अलग ड्रॉअब बनाए रखने हैं।
डेविडस

2
काश मैं इसे दो बार बढ़ा पाता। बस हार्डकोडेड # आरजीबी के बजाय संदर्भों का उपयोग करने के लिए मेरी आकृतियों को कारगर बनाने की कोशिश की और वही त्रुटि मिली। एक समाधान के लिए एसओ के पास आया और यह वही उत्तर मिला जिसे मैंने 2 सप्ताह पहले उतारा था! (फेसपालम)
टिक्सी

2
यह सुपर निंजा है!
MariusBudin

4
आह! Google के लिए बैक-फ़िक्स बनाने के लिए यह सर्वोच्च प्राथमिकता होनी चाहिए! ? Attr-reference संकेतन इतना उपयोगी और महत्वपूर्ण है कि अगर आपके पास किसी ऐप में कई थीम हैं, तो उसके बिना जीना असंभव है। अभी मुझे कस्टम बटन प्रकारों में से प्रत्येक के लिए तीन ड्रा करने योग्य XMLs बनाने हैं!
Stephan Henningsen

2
मैं चाहता हूँ <21 एसडीके में बहुत सरल और अच्छा समाधान।
अदनान अब्दुल्ला

20

lollipop(API 21) से शुरू होने वाला यह फीचर समर्थित है, https://code.google.com/p/android/issues/detail?id/2661 देखें

हालाँकि, यदि आप लॉलीपॉप के बिना उपकरणों को लक्षित कर रहे हैं, तो इसका उपयोग न करें, क्योंकि यह दुर्घटनाग्रस्त हो जाएगा, इसके बजाय स्वीकृत उत्तर में समाधान का उपयोग करें।


क्या पूर्व L API पर काम करने के लिए किसी प्रकार की सहायता लाइब्रेरी का उपयोग करने का कोई मौका है?
इवान

2
नहीं, समर्थन पुस्तकालय API का एक सेट है जिसका उपयोग पुराने उपकरणों पर किया जा सकता है, यह व्यवहार परिवर्तन कंपाइलर और बिल्ड टूल में है, इसलिए यह समर्थन लाइब्रेरी से संबंधित नहीं है।
मर्मर

3
नहीं, लॉलीपॉप में यह एक कार्यान्वित विशेषता नहीं थी, बल्कि एक चमकदार बग फिक्स थी। और उस पर एक गंभीर बग।
एड्रियन सिसरू

अरे, मैंने सोचा कि मैं एक अच्छा थीमाधारित समाधान था। अब मुझे वापस जाना है और बटन चयनकर्ता ड्राबल्स का एक गुच्छा बनाना है।
गंदी_विलास

4

हालाँकि , प्री-लॉलीपॉप डिवाइसेस पर ड्रॉबल्स से स्टाइल की विशेषताओं को संदर्भित करना संभव नहीं है, लेकिन यह रंग राज्य सूचियों के लिए संभव है। आप Android सहायता लाइब्रेरी से AppCompatResources.getColorStateList (संदर्भ, int resId) विधि का उपयोग कर सकते हैं । नकारात्मक पक्ष यह है कि आपको उन रंगीन राज्य सूचियों को प्रोग्रामेटिक रूप से सेट करना होगा।

यहाँ एक बहुत ही बुनियादी उदाहरण है।

रंग / my_color_state.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_checked="true" android:color="?colorControlActivated" />
  <item android:color="?colorControlNormal" />
</selector>

एक विजेट जो एक रंग राज्य सूची की जरूरत है:

<RadioButton
  android:id="@+id/radio_button"
  android:text="My Radio" />

और सबसे महत्वपूर्ण:

ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.my_color_state);    
RadioButton r = (RadioButton) findViewById(R.id.radio_button);
r.setTextColor(csl);

खैर, सबसे सुरुचिपूर्ण या सबसे छोटा तरीका नहीं है, लेकिन यह वही है जो एंड्रॉइड सपोर्ट लाइब्रेरी इसे एंड्रॉइड के पुराने संस्करणों (प्री-लॉलीपॉप) पर काम करने के लिए करता है।

दुर्भाग्य से, ड्रॉबल्स के लिए इसी तरह की विधि शैली विशेषताओं के साथ काम नहीं करती है।


1

मैंने https://stackoverflow.com/a/59467269/3841352 में इसी सवाल का जवाब दिया, लेकिन मैं इसे यहाँ पोस्ट करूँगा:

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

वर्कअराउंड मूल रूप से एक ड्रा करने योग्य संसाधन बनाता है जो विशेषता मान का संदर्भ देने वाला होगा।

आपके मामले का वर्णन करने के लिए इसका समाधान निम्नलिखित होगा:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="?attr/colorPrimary" android:state_enabled="true" android:state_window_focused="false"/>
    <item android:drawable="?attr/colorPrimaryDark" android:state_pressed="true"/>
    <item android:drawable="@android:color/darker_gray" android:state_enabled="false"/>
    <item android:drawable="?attr/colorPrimary"/>
</selector>

आप एक आकर्षक संसाधन के लिए? Attr / * की जगह लेंगे:

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

इस रूप में परिभाषित किया जाएगा:

drawable / colorPrimaryDrawable

<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle">
    <solid android:color="?attr/colorPrimary" />
</shape>

drawable / colorPrimaryDarkDrawable

<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle">
    <solid android:color="?attr/colorPrimaryDark" />
</shape>

आशा करता हूँ की ये काम करेगा!!


0

जैसा कि @ मरमोर ने कहा कि यह अब एपीआई 21 पर समर्थित है। लेकिन हमारे लिए जिन्हें एंड्रॉइड की विरासत संस्करणों का समर्थन करने की आवश्यकता है, आप इस सुविधा का उपयोग कर सकते हैं। V7 सपोर्ट लाइब्रेरी का उपयोग करके आप अभी भी इसका उपयोग न्यूनतम एसडीके स्तर वाले एप्स पर कर सकते हैं जो सभी 7 से नीचे हैं।

AppCompatImageViewV7 में Android समर्थन लाइब्रेरी इस सुविधा का एक बग मुक्त कार्यान्वयन है। बस के ImageViewसाथ अपने usages की जगह AppCompatImageView


2
उम्मीद है लगता है! लेकिन समस्या ड्रॉबल शेप में है न कि व्यू में। मेरे पास एक ऐप्पोमैट दृश्य संदर्भित (पृष्ठभूमि के रूप में) एक आकृति है जो एक थीम्ड रंग प्राप्त करने के लिए एटर का उपयोग करता है और यह <21 पर उपरोक्त त्रुटि के साथ आता है। क्या मेरे पास एक अप्वाइंटमेंट ड्रॉबल है जो मुझे याद नहीं है?
नील

Android 5.0.1 jy Huawei अभी भी प्रभावित है।
सुथारटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.