कैसे काम करता है "? Android: attr / activeBackgroundIndicator" काम करता है?


86

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

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

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

जवाबों:


221

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

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

वास्तव में इसका मतलब है कि पृष्ठभूमि को कुछ ड्रॉबल के लिए सेट करें।

लेकिन यह देखने के लिए कि हम अपने रहस्यमय ड्रॉबल को कैसे प्राप्त करते हैं, इसे और विघटित करते हैं।

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

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

असल में, ActiveBackgroundIndicator वास्तविक ड्रॉबल नहीं है , बल्कि ड्रॉबल का एक संदर्भ है । तो वास्तव में "ActivBackgroundIndictor" विशेषता कहाँ परिभाषित है?

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

path_to_android_sdk / प्लेटफार्मों / Android-17 / डेटा / Res / मान / attrs.xml

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

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

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

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

path_to_android_sdk / प्लेटफ़ॉर्म / एंड्रॉइड -17 / डेटा / रेस / वैल्यू / थीम.एक्सएमएल

यदि आप उस फ़ाइल को खोलते हैं, तो आप जिस विषय का उपयोग कर रहे हैं, उसके आधार पर आपको कई परिभाषाएँ दिखाई देंगी । उदाहरण के लिए, यहाँ थीम नाम, थीम.लाइट, थीम.होल, थीम के लिए परिभाषाएँ दी गई हैं।

<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 / प्लेटफार्मों / Android-17 / डेटा / res / drawable / active_background.xml

यदि आप उस फ़ाइल को खोलते हैं तो आपको ड्रॉबल की परिभाषा दिखाई देगी जो समझना महत्वपूर्ण है कि क्या चल रहा है।

<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>

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

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

"list_selector_background_selected" एक 9 पैच png फ़ाइल है जो कि drawable-hdpi फ़ोल्डर में स्थित है।

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


3
उन सभी पर शासन करने के लिए एक उत्तर। तो मूल रूप से अगर कोई एक ही चयनकर्ताओं के साथ एक्सएमएल बनाने के लिए था, तो वह अपना खुद का "सक्रियबैकग्राउंडइंडिएटर" बना सकता था?
— Gee.E

1
वास्तव में - आप इसे अपने कस्टम विषय में फिर से परिभाषित कर सकते हैं। xml b / c इसकी संदर्भ विशेषता है।
— अंकन सालती

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

यह selectorड्रॉबल्स का उपयोग करके कस्टम काम पर काम करने के लिए एक महान संसाधन है । इसे पढ़ने के बाद मैंने शेष टुकड़ों में भरने के लिए स्टाइल एटिकेट डॉक्स का उपयोग किया ।
— मौरिजियो

1
क्या आप इस पृष्ठभूमि के संकेतक को ओवरराइड करने का एक उदाहरण प्रदान कर सकते हैं? मेरा काम नहीं करता है: / <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> <आइटम का नाम = "android: activeBackgroundIndicator"> @ drawable / सक्रिय / बैकग्राउंड </ आइटम> </ style> active_background.xml : <चयनकर्ता xmlns: android = " schemas.android.com/apk/res/android "> <आइटम Android: state_activated = "सत्य" android: drawable = "@ रंग / पीला" /> <आइटम android: draw_ = "@" एंड्रॉइड: रंग / पारदर्शी "/> </ चयनकर्ता>
— वंडस

13

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

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

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

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

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

Android attrगुणों की एक सूची R.attr पर देखी जा सकती है

  • activatedBackgroundIndicator एंड्रॉइड 3.0+ में एक परिभाषित ड्रॉबल है

    सक्रिय वस्तुओं के लिए एक पृष्ठभूमि के रूप में इस्तेमाल किया जा सकने योग्य।

यह मूल रूप से ओएस में परिभाषित एक मानक आइटम है। मुझे Android स्रोत में नहीं मिल रहा है, लेकिन यहाँ प्रलेखन के लिए एक कड़ी है। activatedBackgroundIndicator


5

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

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

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

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

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

संपादित करें

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

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


2

अपडेट: एपीआई गाइड से अधिक विस्तृत संस्करण उपलब्ध है इसलिए मैं इसे उद्धृत करना चाहूंगा।

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

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

मूल उत्तर:

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

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

[<PACKAGE_NAME>:] [<resource_type> /] <RESOURCE_NAME>

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