2013-02-21 8 views
77

मैं चयन के लिए प्रासंगिक कार्रवाई बार प्रदर्शित करते समय किसी सूची में किसी चयनित आइटम को हाइलाइट करना चाहता था, और मुझे जो समाधान मिला वह android:background मेरी पंक्ति लेआउट xml से "?android:attr/activatedBackgroundIndicator" की विशेषता को सेट करना था।"एंड्रॉइड: एटीआर/एक्टिवेटेड बैकग्राउंड इंडिकेटर" कैसे काम करता है?

हालांकि यह काम कैसे सेट करता है?

  1. तंत्र क्या शामिल है?
  2. "?", "Attr", "सक्रिय बैकग्राउंड इंडिकेटर" जैसे वाक्यविन्यास तत्व क्या हैं?
  3. "सक्रिय बैकग्राउंड इंडिकेटर" का अर्थ कहां परिभाषित किया गया है?

उत्तर

206

यदि आप फोरेंसिक मूड में हैं तो यहां खोदना और पता चलाना है कि क्या हो रहा है।

android:background="?android:attr/activatedBackgroundIndicator"? 

सहजता से इसका मतलब पृष्ठभूमि को कुछ आकर्षित करने के लिए सेट करना है।

लेकिन यह देखने के लिए कि हम अपने रहस्यमय चित्रकारी कैसे प्राप्त करते हैं, इसे आगे बढ़ाएं।

सटीक इसका मतलब है activatedBackgroundIndicator "क्या विशेषता के लिए पृष्ठभूमि विशेषता निर्धारित" होना करने के लिए "वर्तमान विषय में को संदर्भित करता है

यदि आप समझते हैं" वर्तमान विषय में को संदर्भित करता है "भाग, आप मूल रूप से है सब कुछ है कि कवर के पीछे चल रहा है समझा।

असल में, activatedBackgroundIndicator एक वास्तविक drawable लेकिन एक drawable के लिए एक संदर्भ नहीं है। इसलिए जहां "activateBackgroundIndictor" वास्तव में परिभाषित विशेषता है?

+०१२३५१६४१०

यह आपकी एसडीके निर्देशिका में फ़ाइल नाम attrs.xml में परिभाषित किया गया है। उदाहरण के लिए:

path_to_android_sdk/प्लेटफ़ॉर्म/एंड्रॉइड-17/डेटा/res/values ​​/ attrs।एक्सएमएल

आपको लगता है कि फ़ाइल को खोलने के हैं, तो आप घोषणा के रूप में निम्नानुसार होगा:

<attr name="activatedBackgroundIndicator" format="reference" /> 

attrs.xml है जहाँ आप सभी विशेषताओं कि आप बाद में अपने दृश्य एक्सएमएल में उपयोग करने के लिए जा रहे हैं की घोषणा। ध्यान दें कि हम विशेषता और उसके प्रकार की घोषणा कर रहे हैं और वास्तव में पर कोई मान निर्दिष्ट नहीं कर रहे हैं।

वास्तविक मूल्य themes.xml में असाइन किया गया है। इस फ़ाइल पर स्थित है:

path_to_android_sdk/प्लेटफार्मों/एंड्रॉयड -17/डेटा/res/values ​​/ themes.xml

आपको लगता है कि फ़ाइल को खोलने के हैं, तो आप कई परिभाषाएं देखेंगे का उपयोग कर रहे विषय के आधार पर। उदाहरण के लिए, यहाँ के लिए विषयों का नाम विषय परिभाषाएं दी गई हैं, Theme.Light, Theme.Holo क्रमश: Theme.Holo.Light:

<item name="activatedBackgroundIndicator">@android:drawable/activated_background</item> 
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_light</item> 
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_dark</item> 
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_light</item> 

अब हम हमारी रहस्यमय ड्रॉएबल है।

path_to_android_sdk/प्लेटफार्मों/एंड्रॉयड -17/डेटा/res/drawable/activated_background.xml

यदि आप खोलें: आप पहली बार एक चुनना है, यह पर drawable फ़ोल्डर में परिभाषित किया गया है उस फ़ाइल में आप ड्रॉइंग की परिभाषा देखेंगे जो समझ रहा है कि क्या हो रहा है।

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_activated="true" android:drawable="@android:drawable/list_selector_background_selected" /> 
    <item android:drawable="@color/transparent" /> 
</selector> 

यहाँ हम दोनों राज्यों के साथ एक drawable परिभाषित कर रहे हैं - डिफ़ॉल्ट स्थिति सिर्फ पारदर्शी पृष्ठभूमि है और यदि राज्य "state_activated" है तो हमारे drawable "list_selector_background_selected" है।

ड्रॉबल्स और राज्यों पर पृष्ठभूमि की जानकारी के लिए this link देखें।

"list_selector_background_selected" एक 9 पैच पीएनजी फ़ाइल है जो ड्रॉबल-एचडीपीआई फ़ोल्डर में स्थित है।

अब आप देख सकते हैं कि हमने सक्रिय बैकग्राउंड इंडिकेटर को संदर्भ के रूप में सीधे संदर्भित करने के बजाय संदर्भ के रूप में क्यों परिभाषित किया - यह आपको आपकी थीम के आधार पर सही ड्रॉइंग चुनने की अनुमति देता है।

+3

एक जवाब। तो मूल रूप से यदि कोई एक ही चयनकर्ता के साथ एक्सएमएल बनाना चाहता था, तो वह अपना "सक्रिय बैकग्राउंड इंडिकेटर" बना सकता था? –

+1

बिल्कुल - आप इसे अपने कस्टम थीम.एक्सएमएल बी/सी में एक संदर्भ विशेषता में फिर से परिभाषित कर सकते हैं। –

+0

इस उत्तर ने मुझे यह पता लगाने में मदद की कि मेरे नेविगेशन ड्रॉवर सूची आइटम पर कस्टम ड्रायबल कैसे सेट किया जाए। – Tastybrownies

13

मैंने इसे एक बिंदु पर भी आश्चर्यचकित किया। एंड्रॉइड संसाधनों की एक बड़ी राशि ब्लैक-बॉक्स की तरह लगती है और उन्हें सीधे नहीं देख सकती है। मैं उन्हें कुछ जगह याद कर सकता हूं, लेकिन मैं उन्हें एसडीके स्रोत कोड में नहीं ढूंढ सकता। मैं यही जानता हूं।

  • android:background एक ड्रायबल लेगा।
  • वाक्य रचना शैली में है

    रूप में एक और संसाधन के लिए एक संदर्भ होना चाहिए, "@ [+] [पैकेज:] के प्रकार: नाम"? या रूप में एक विषय विशेषता को "[पैकेज :] [प्रकार:] नाम "

इस मामले ? पैकेज android में एक विषय को देखने के लिए प्रतीक है और यह प्रकार attr जहां नाम activatedBackgroundIndicator है की है।

आपको कोड-पीछे में android.R.attr.activatedBackgroundIndicator के साथ भी इसे एक्सेस करने में सक्षम होना चाहिए।

एंड्रॉयड attr गुण की एक सूची R.attr

  • activatedBackgroundIndicator में पाया जा सकता है एंड्रॉयड में एक परिभाषित drawable 3.0+

    के रूप में Drawable सक्रिय मदों के लिए एक पृष्ठभूमि के रूप में इस्तेमाल किया।

यह मूल रूप से सिर्फ एक मानक वस्तु ओएस में परिभाषित किया गया है। मुझे एंड्रॉइड स्रोत में नहीं मिल रहा है, लेकिन यहां प्रलेखन का एक लिंक है। activatedBackgroundIndicator

5

यह थीम से मूल्य जोड़ने का एक रूप है। मान तकनीकी रूप से संसाधन संकलन के दौरान ज्ञात नहीं है क्योंकि थीम मान उस बिंदु पर ज्ञात नहीं हो सकते हैं। इसके बजाय मूल्य को वास्तविक समय (0)से ली गई वास्तविक थीम के आधार पर रनटाइम पर हल किया जाता है।

यह संसाधन मूल्यों का पुन: उपयोग करने का एक तरीका प्रदान करता है। मैं यहाँ प्रदर्शन के अनुसार बात नहीं कर रहा हूं, बल्कि संगठन और रखरखाव के अनुसार। गुण कार्य करता है क्योंकि यह वादे के साथ एक चर था कि यह रनटाइम पर वास्तविक मान रखेगा।

यह दृष्टिकोण अधिक अनुकूलन के लिए भी अनुमति देता है - उदाहरण के मूल्य को हार्डकोड करने के बजायविंडो पृष्ठभूमि खींचने योग्य यह कुंजी के रूप में एक चयनित विशेषता की आपूर्ति, एक विषय से वास्तविक खींचने योग्य हो जाता है। इससे आपको उस विशेषता के मान को ओवरराइड करने देता है। आपको बस इसकी आवश्यकता है:

  1. अपनी खुद की थीम बनाएं (जो "शैली" संसाधन के लिए केवल एक फैंसी नाम है), जो आमतौर पर डिफ़ॉल्ट विषयों में से एक से प्राप्त होता है।
  2. प्रश्न में विशेषता के लिए अपना खुद का मूल्य प्रदान करें।

प्लेटफ़ॉर्म स्वचालित रूप से आपके मान का उपयोग करेगा बशर्ते आपने अपनी थीम को किसी गतिविधि या एप्लिकेशन के लिए निर्दिष्ट किया हो। आप इस सवाल में वर्णित की तरह ऐसा करते हैं। थीम-विशेषता संदर्भों का सामान्य वाक्यविन्यास यहां वर्णित है: Referencing style attributes। आपको वहां पूरी तंत्र का एक उदाहरण और वर्णन भी मिलेगा।

संपादित

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

आपको एपीआई के हिस्से के रूप में विशेषता नामों का इलाज करना चाहिए - दूसरे शब्दों में, वे उस अनुबंध का हिस्सा हैं जिसका उपयोग करने के लिए आपको अनुमति है। यह कक्षाओं और उनके हस्ताक्षरों के समान ही है - आप पिछले डिवाइस स्थान प्राप्त करने के उद्देश्य से LocationManager कक्षा का उपयोग करते हैं क्योंकि आप कुछ स्रोत (ट्यूटोरियल, संदर्भ, आधिकारिक मार्गदर्शिका, आदि) से जानते हैं, इस वर्ग का उद्देश्य क्या है। इसी तरह, एंड्रॉइड प्लेटफ़ॉर्म दस्तावेज़ में विशेषता नाम और उनका उद्देश्य (कभी-कभी अच्छी तरह से, कभी-कभी दुखी) परिभाषित किया जाता है।

2

numan salati पहले से ही एक सही उत्तर दिया गया है लेकिन इसने "?" को संबोधित नहीं किया है वाक्य - विन्यास। यहाँ एपीआई गाइड से एक उद्धरण Accessing Resources

एक शैली विशेषता संदर्भित करने के लिए है, नाम वाक्य रचना सामान्य संसाधन प्रारूप के लगभग समान है, लेकिन इसके बजाय के कम से-प्रतीक (@), एक सवाल-चिह्न का उपयोग (?) , और संसाधन प्रकार भाग वैकल्पिक है। उदाहरण के लिए:

?[<PACKAGE_NAME>:] [<resource_type> /] < RESOURCE_NAME उन सब को शासन करने के लिए >

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

  • कोई संबंधित समस्या नहीं^_^