2012-04-13 10 views
35

मैं एंड्रॉइड के लिए नया हूं और मैं अपने आवेदन में सभी चेक बॉक्स में एक शैली सेट करने की कोशिश कर रहा हूं। मेरी एप्लिकेशन शैली थीम पर सेट है। होलो जो अंधेरा है और मैं शैली सूची के लिए अपनी सूची दृश्य पर चेक बॉक्स देखना चाहता हूं। Holo.Light। मैं एक कस्टम शैली बनाने की कोशिश नहीं कर रहा हूँ। नीचे दिया गया कोड काम नहीं कर रहा है, कुछ भी नहीं होता है। मुझे ऐसा करने की ज़रूरत है क्योंकि मेरी सूची दृश्य में हल्का पेपर बनावट है और चेक बॉक्स और चेक बॉक्स टेक्स्ट सफेद है जो मुझे अंधेरा चाहिए।एंड्रॉइड चेकबॉक्स शैली

<style name="CustomActivityTheme" parent="@android:style/Theme.Holo"> 
    <item name="android:checkboxStyle">@style/customCheckBoxStyle</item> 
</style> 

<style name="customCheckBoxStyle" parent="@android:style/Widget.Holo.Light.CompoundButton.CheckBox"> 
</style> 

इसके अलावा, आप अगर आप आवेदन करने के लिए एक शैली निर्धारित अलग-अलग विजेट शैलियों सेट कर सकते हैं?

उत्तर

52

हो सकता है कि यह आप को पूरा करेगा -

something.xml

<CheckBox 
    android:text="Custom CheckBox" 
    android:button="@drawable/checkbox_selector" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 

चयनकर्ता

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

के लिए, संदर्भ सिर्फ उल्लेख here

0

पिछले जवाब भी खंड <selector>...</selector> में में आप की आवश्यकता हो सकती:

<item android:state_pressed="true" android:drawable="@drawable/checkbox_pressed" ></item> 
108

नोट: का उपयोग Android समर्थन लाइब्रेरी v22.1.0 और एपीआई स्तर 11 को लक्षित और ऊपर? अंतिम अद्यतन तक नीचे स्क्रॉल करें।


मेरा आवेदन शैली Theme.Holo के लिए निर्धारित है जो अंधेरा है और मैं मेरी सूची दृश्य पर चेक बॉक्स की तरह शैली Theme.Holo.Light का होगा। मैं एक कस्टम शैली बनाने की कोशिश नहीं कर रहा हूं। काम करने के लिए नीचे दिया गया कोड प्रतीत नहीं होता है, कुछ भी नहीं होता है।

सबसे पहले यह स्पष्ट नहीं हो सकता है कि सिस्टम इस व्यवहार को क्यों प्रदर्शित करता है, लेकिन जब आप वास्तव में यांत्रिकी में देखते हैं तो आप इसे आसानी से कम कर सकते हैं। मैं आपको चरण-दर-चरण इसके माध्यम से ले जाने देता हूं।

सबसे पहले, देखते हैं कि Widget.Holo.Light.CompoundButton.CheckBox शैली परिभाषित करता है। चीजों को और स्पष्ट करने के लिए, मैंने 'नियमित' (गैर-प्रकाश) शैली परिभाषा भी जोड़ा है।

<style name="Widget.Holo.Light.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" /> 

<style name="Widget.Holo.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" /> 

आप देख सकते हैं, दोनों खाली घोषणाओं कि बस एक अलग नाम में Widget.CompoundButton.CheckBox लपेट कर रहे हैं। तो आइए उस मूल शैली को देखें।

<style name="Widget.CompoundButton.CheckBox"> 
    <item name="android:background">@android:drawable/btn_check_label_background</item> 
    <item name="android:button">?android:attr/listChoiceIndicatorMultiple</item> 
</style> 

यह शैली पृष्ठभूमि और बटन दोनों को संदर्भित करती है। btn_check_label_background केवल 9-पैच है और इसलिए इस मामले के संबंध में बहुत दिलचस्प नहीं है। हालांकि, ?android:attr/listChoiceIndicatorMultiple इंगित करता है कि वर्तमान थीम (यह जानना महत्वपूर्ण है) CheckBox के वास्तविक रूप को निर्धारित करेगा।

listChoiceIndicatorMultiple एक थीम विशेषता है, तो आपको इसके लिए कई घोषणाएं मिलेंगी - प्रत्येक थीम के लिए एक (या यदि कोई मूल विषय से विरासत में नहीं मिलता है)।यह इस प्रकार दिखेगा (स्पष्टता के लिए छोड़े गए अन्य विशेषताओं के साथ):

<style name="Theme"> 
    <item name="listChoiceIndicatorMultiple">@android:drawable/btn_check</item> 
    ... 
</style> 

<style name="Theme.Holo"> 
    <item name="listChoiceIndicatorMultiple">@android:drawable/btn_check_holo_dark</item> 
    ... 
</style> 

<style name="Theme.Holo.Light" parent="Theme.Light"> 
    <item name="listChoiceIndicatorMultiple">@android:drawable/btn_check_holo_light</item> 
    ... 
</style> 

तो यह जहां असली जादू होता है: विषय के listChoiceIndicatorMultiple विशेषता के आधार पर, CheckBox की वास्तविक उपस्थिति निर्धारित होता है। जो घटना आप देख रहे हैं उसे अब आसानी से समझाया गया है: क्योंकि उपस्थिति विषय-आधारित है (और शैली-आधारित नहीं है, क्योंकि यह केवल एक खाली परिभाषा है) और आप Theme.Holo से विरासत में हैं, आपको हमेशा CheckBox उपस्थिति मिल जाएगी थीम से मेल खाते हैं।

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

अपने दूसरे प्रश्न का सवाल है:

इसके अलावा, आप अलग-अलग विजेट शैलियों सेट कर सकते हैं यदि आप आवेदन करने के लिए शैली सेट करें?

बिल्कुल, और वे किसी भी गतिविधि- या एप्लिकेशन-सेट शैलियों को ओवरराइड करेंगे।

क्या कोई थीम (छवियों के साथ शैली) को चेकबॉक्स विजेट पर सेट करने का कोई तरीका है। (...) क्या इस चयनकर्ता का उपयोग करने के लिए वैसे भी है: link?


अद्यतन:

मुझे फिर से कह रही है कि आप एंड्रॉयड के आंतरिक संसाधनों पर निर्भर नहीं करना पड़ेगा साथ शुरू करते हैं। एक कारण है कि आप कृपया आंतरिक नामस्थान तक पहुंच नहीं सकते हैं।

हालांकि, सिस्टम संसाधनों तक पहुंचने का एक तरीका नाम से आईडी लुकअप कर रहा है। निम्नलिखित कोड का टुकड़ा पर विचार करें:

int id = Resources.getSystem().getIdentifier("btn_check_holo_light", "drawable", "android"); 
((CheckBox) findViewById(R.id.checkbox)).setButtonDrawable(id); 

पहली पंक्ति वास्तव में btn_check_holo_light drawable संसाधन के संसाधन आईडी वापस आ जाएगी। चूंकि हमने पहले स्थापित किया था कि यह बटन चयनकर्ता है जो CheckBox के रूप को निर्धारित करता है, हम इसे विजेट पर 'बटन खींचने योग्य' के रूप में सेट कर सकते हैं। परिणाम Holo.Light संस्करण की उपस्थिति के साथ, कोई फर्क नहीं पड़ता कि आप किस विषय/शैली को xml में एप्लिकेशन, गतिविधि या विजेट पर सेट करते हैं। चूंकि यह केवल बटन को खींचने योग्य सेट करता है, इसलिए आपको अन्य स्टाइल को मैन्युअल रूप से बदलना होगा; जैसे पाठ उपस्थिति के संबंध में।

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

Screenshot showing the result


Update2:

the introduction of Support Library v22.1.0 साथ

, चीजों को अब और भी आसान हो गया है!रिलीज नोट्स से एक उद्धरण (मेरे जोर): - इस तरह के प्रकाश की गतिविधियों पर अंधेरे कार्रवाई सलाखों के रूप में बातों के लिए अविश्वसनीय रूप से उपयोगी

लॉलीपॉप android:theme XML विशेषता का उपयोग करके दृश्य स्तर से एक दृश्य में विषय के ऊपर लिख करने की क्षमता जोड़ा । अब, AppCompat आपको टूलबार के लिए android:theme का उपयोग करने की अनुमति देता है (app:theme पहले इस्तेमाल किया गया था) और भी बेहतर है, android:theme एपीआई 11+ उपकरणों पर सभी दृश्यों को समर्थन देता है।

दूसरे शब्दों में: अब आप एक पर-व्यू आधार है, जो मूल समस्या बहुत आसान सुलझाने में आता है पर एक विषय लागू कर सकते हैं: बस थीम निर्दिष्ट आप आंकड़े देख सकते लागू करना चाहते हैं । अर्थात।

<CheckBox 
    ... 
    android:theme="@android:style/Theme.Holo" /> 

<CheckBox 
    ... 
    android:theme="@android:style/Theme.Holo.Light" /> 

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

बेशक आपको अब होलो थीम का उपयोग नहीं करना चाहिए, बल्कि इसके बजाय सामग्री का उपयोग करना चाहिए।

<style name="CustomActivityTheme" parent="@android:style/Theme.Holo"> 
    <item name="android:checkboxStyle">@style/customCheckBoxStyle</item> 
</style> 

<style name="customCheckBoxStyle" parent="@android:style/Widget.CompoundButton.CheckBox"> 
    <item name="android:textColor">@android:color/black</item> 
</style> 

ध्यान दें, textcolor आइटम:

+0

जवाब देने के लिए समय निकालने के लिए धन्यवाद। मैं यहां मुद्दा देखता हूं और मैं अभी भी सोच रहा हूं कि क्या मुझे बहुत सारे काम करने के साथ किया जा सकता है। चेकबॉक्स विजेट पर थीम (छवियों के साथ शैली) सेट करने का कोई तरीका है। मुझे पता है कि मैं छवियों को ढूंढ सकता हूं और उन्हें अपनी परियोजना में शामिल कर सकता हूं लेकिन ऐसा लगता है कि यह मारने जैसा है। क्या इस चयनकर्ता का उपयोग करने के लिए वैसे भी है: https://github.com/android/platform_frameworks_base/blob/master/core/res/res/drawable/btn_check_holo_light.xml – user1330739

+2

@ user1330739: हां और नहीं। आपको आंतरिक संसाधनों पर भरोसा नहीं करना चाहिए क्योंकि Google भविष्य में रिलीज में उन्हें बदलने का फैसला कर सकता है। अपने स्थानीय संसाधनों में drawables की एक प्रति सहित वास्तव में आपका सबसे अच्छा विकल्प है। ऐसा कहा जा रहा है कि, एक और (बदसूरत) समाधान है जिसे मैं जानता हूं, लेकिन यह केवल रनटाइम पर काम करता है (जिसका अर्थ है कि आप इसे अपनी एक्सएमएल फाइलों में संदर्भित नहीं कर सकते हैं)। कृपया उपरोक्त मेरे उत्तर में संपादन देखें। –

+0

@ एमएच। बहुत बढ़िया। –

4

शायद आप की तरह कुछ करना चाहते हैं।

14

सामग्री डिजाइन के लिए यह करने के लिए सही तरीका है:

शैली:

<style name="MyCheckBox" parent="Theme.AppCompat.Light"> 
    <item name="colorControlNormal">@color/foo</item> 
    <item name="colorControlActivated">@color/bar</item> 
</style> 

लेआउट:

<CheckBox 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:checked="true" 
    android:text="Check Box" 
    android:theme="@style/MyCheckBox"/> 

यह पर लॉलीपॉप + सामग्री एनिमेशन सुरक्षित करेगा।

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