2012-02-22 13 views
39

मैं कोड के माध्यम से एक विशेषता से पॉइंटिंग संदर्भ प्राप्त करने के लिए देख रहा हूँ।कोड में attr संदर्भ कैसे प्राप्त करें?

android:background="?attr/listItemBackground" 

विशेषता संदर्भ मेरी थीम द्वारा निर्धारित है: मेरे एक्सएमएल लेआउट में मैं आसानी से इस तरह संदर्भित drawable मिल सकती है। मैं यह देखने के लिए देख रहा हूं कि कोड के माध्यम से उस संदर्भित ड्रॉबल को प्राप्त करना संभव है या नहीं।

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

धन्यवाद!

उत्तर

99

यह आपको कैसे करना है यह:

// Create an array of the attributes we want to resolve 
// using values from a theme 
int[] attrs = new int[] { R.attr.listItemBackground /* index 0 */}; 

// Obtain the styled attributes. 'themedContext' is a context with a 
// theme, typically the current Activity (i.e. 'this') 
TypedArray ta = themedContext.obtainStyledAttributes(attrs); 

// To get the value of the 'listItemBackground' attribute that was 
// set in the theme used in 'themedContext'. The parameter is the index 
// of the attribute in the 'attrs' array. The returned Drawable 
// is what you are after 
Drawable drawableFromTheme = ta.getDrawable(0 /* index */); 

// Finally, free the resources used by TypedArray 
ta.recycle(); 
+1

आपके उत्तर के लिए धन्यवाद। यह ऐसा करने का एकमात्र तरीका प्रतीत होता है। – Jona

+0

मैंने कोशिश की लेकिन यह इंडेक्स 0 का उपयोग करके काम नहीं करेगा, बल्कि 1 (जिसे 'getIndex (0) ' –

+0

द्वारा वापस किया गया है, मुझे R.attr.selectableItemBackground के साथ R.attr.selectableItemBackground को संकलित करने के लिए प्रतिस्थापित करना था। – dimsuz

0

आप उपयोग नहीं करना चाहिए:

android:background="@drawable/listItemBackground"

और फिर:

myImageButton.getBackgroundDrawable()

या हो सकता है मैं समझ में नहीं आया ...

+0

अच्छी तरह से विचार यह है कि मैं attr/listItemBackground से संदर्भित संसाधन तक पहुंच बनाना चाहता हूं जिसमें थीम.एक्सएमएल के माध्यम से उचित संदर्भ सेट है, दृश्य से पहले से सेट पृष्ठभूमि प्राप्त करना समस्या नहीं है :) – Jona

+0

ठीक है! मुझे लगता है कि context.getResources() से सीधे "? Attr/listItemBackground" प्राप्त करने का प्रयास करके संभव है। लेकिन मुझे यह भी लगता है कि ड्रॉबल्स को संदर्भित करने से बेहतर समाधान हैं। क्या हम मुख्य विचार के बारे में चर्चा कर सकते हैं? (या नहीं यदि आपको लगता है कि यह समाधान सबसे अच्छा है) –

+0

ठीक है, मेरे पास मेरे ऐप के लिए एक जटिल अभी तक संगठित थीम है। लेकिन यह एक मामला मैं देखना चाहता था कि यह संभव था और इसका उपयोग कैसे किया जा सके। आपको लगता है कि res.getDrawable (R.attr.listItemBackground) ऐसा करेगा क्योंकि संसाधन पहले से ही सेट सेट के साथ ठीक से सेट है और सही संसाधन को इंगित करता है। लेकिन यह लगता है कि यह थोड़ा अधिक जटिल है ... – Jona

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