Style.xml में कस्टम विशेषताएँ


178

मैंने एक कस्टम विजेट बनाया है, और मैं इसे layout.xml में घोषित कर रहा हूं। मैंने attr.xml में कुछ कस्टम विशेषताएँ भी जोड़ी हैं। हालाँकि, जब स्टाइल में एक शैली में इन विशेषताओं को घोषित करने की कोशिश की जा रही है। xml, यह मुझे दे रहा हैNo resource found that matches the given name: attr 'custom:attribute'.

मैंने xmlns:custom="http://schemas.android.com/apk/res/com.my.package"सभी टैग्स को style.xml में शामिल किया है, जिनमें शामिल हैं <?xml>, <resources>और <style>, लेकिन यह अभी भी मुझे एक ही त्रुटि देता है, कि यह मेरा कस्टम XML नाम स्थान नहीं पा सकता है।

हालाँकि, मैं अपने लेआउट में दृश्य को विशेषताएँ असाइन करने के लिए अपने नेमस्पेस का उपयोग कर सकता हूं, इसलिए नाम स्थान के साथ कुछ भी गलत नहीं है। मेरा मुद्दा style.xml मेरे attr.xml से अवगत कराने में निहित है।


1
cutsom:xmlns=...?? नहीं होना चाहिए xmlns:cutsom=...?
सेल्विन

हाँ, यही मुझे कॉपी / पेस्ट धन्यवाद का उपयोग न करने के लिए मिलता है
स्टाइलर 1972

जवाबों:


362

मैं यह समझ गया! उत्तर शैली में नाम स्थान निर्दिष्ट नहीं करना है।

<?xml version="1.0" encoding="utf-8" ?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="CustomStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>

        <item name="custom_attr">value</item> <!-- tee hee -->
    </style>
</resources>

13
त्रुटि गायब हो जाती है, लेकिन मेरा विचार विशेषता मान को नहीं अपनाता है, जबकि यह अन्य (गैर-कस्टम) विशेषताओं को अपनाता है। मेरी विशेष विशेषता एक एनम है। क्या स्निपेट आपके लिए काम कर रहा है?
पॉल लामेरट्स्मा

@PaulLammertsma मैं एक एनम का उपयोग कर रहा हूं और यह मेरे लिए काम नहीं करता है। यदि आपके पास कस्टम नाम स्थान xmlns विशेषता नहीं है, तो आप वास्तव में आइटम नाम विशेषता के लिए किसी भी मूल्य को टाइप कर सकते हैं और यह संकलित करेगा।
डेविड स्नेबेल-कॉंट

@DavidCaunt मुझे अंततः वही मिला जो मैं कामकाज पर काम कर रहा था । मैंने अंततः declare-stylableएक एनम के बजाय एक स्ट्रिंग का उपयोग किया । मैं निश्चित नहीं हूं कि एनम काम क्यों नहीं कर रहे थे, लेकिन यह काम मेरे लिए काफी अच्छा था।
पॉल लैमरमत्समा

3
एपीआई lvl 16 का उपयोग करते हुए यह मेरे लिए भी संकलन नहीं करता है।
डेविड मिलर

3
जब यह काम करता है, तो मुझे संदेह है कि विशेषताओं को हल करने में कोई समस्या होगी यदि एक ही नाम वाली विशेषता दो या अधिक पैकेजों में होती है, लेकिन विभिन्न पैकेज नामों के साथ।
AndroidDev

43

उपरोक्त उत्तर मेरे लिए काम कर रहा है, मैंने एक बदलाव की कोशिश की, मैं संसाधन तत्व में एक वर्ग के लिए शैलीगत घोषित करता हूं।

<declare-styleable name="VerticalView">
    <attr name="textSize" format="dimension" />
    <attr name="textColor" format="color" />
    <attr name="textBold" format="boolean" />
</declare-styleable>

में घोषणा-Styleable , नाम विशेषता, एक वर्ग के नाम संदर्भित तो मैं एक दृश्य के वर्ग कॉल "com.my.package.name.VerticalView" था, यह प्रतिनिधित्व किया इस घोषणा VerticalView या VerticalView की उपवर्गों में इस्तेमाल किया जाना चाहिए। तो हम इस तरह शैली की घोषणा कर सकते हैं:

<resources>
    <style name="verticalViewStyle">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">36dip</item>

        <item name="textSize">28sp</item>  <!-- not namespace prefix -->
        <item name="textColor">#ff666666</item>
        <item name="textBold">true</item>
    </style>
</resources>

इसीलिए हमने संसाधन तत्व पर नाम स्थान की घोषणा नहीं की, यह अभी भी काम करता है।


11

मान / styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ...
    <item name="defaultButtonColor">@color/red</item>
    <item name="defaultButtonHeight">@dimen/dp_100</item>
</style>

मान / attrs.xml

<resources>
    <attr name="defaultButtonColor" format="reference" />
    <attr name="defaultButtonHeight" format="reference"/>
</resources>

मान / colors.xml

<resources>
    <color name="red">#f00</color>
</resources>

मान / dimens.xml

<resources>
    <dimen name="dp_100">100dp</dimen>
</resources>

का उपयोग करते हुए

<Button
    android:layout_width="wrap_content"
    android:layout_height="?attr/defaultButtonHeight"
    android:text="Button"
    android:textColor="?attr/defaultButtonColor"
    />

यहां छवि विवरण दर्ज करें

डेमो


10

स्टाइलर और विंस के संशोधन ने मेरे लिए काम किया। मैं यह बताना चाहता था कि @ विंस की व्याख्या पूरी तरह से सटीक नहीं हो सकती है।

इस परिकल्पना का परीक्षण करने के लिए कि declare-styleableकस्टम दृश्य वर्ग के नाम के मिलान का गुण हमें बिना नाम के परिवर्तित किए गए कस्टम विशेषता का उपयोग करने की अनुमति देता है, मैंने इसका नाम बदल दिया declare-styleable(कस्टम दृश्य का नाम दिया गया था TestViewFont:

<declare-styleable name="TextViewFont2">
    <attr name="font" format="integer"/>
</declare-styleable>

मैंने obtainStyledAttributesइसे दर्शाने के लिए कस्टम दृश्य में कॉल को बदल दिया :

TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.TextViewFont2, 0, 0);

कोड अभी भी चला। इसलिए मुझे नहीं लगता कि declare-styleableजिस वर्ग का नाम लिया गया है, उसके द्वारा यह किसी तरह का आत्मनिरीक्षण है ।

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

भले ही, सभी लोगों की मदद के लिए धन्यवाद, इसने मेरी समस्या को हल कर दिया।


दरअसल, विशेषताएँ समान नाम स्थान साझा करती हैं, चाहे वे किसी declare-styleableब्लॉक में घोषित किए गए हों या नहीं। (क्षमा करें, मुझे इसके लिए संदर्भ पृष्ठ नहीं मिल सकता है ...) androidनाम स्थान की विशेषताओं को छोड़कर , आपको केवल विशेषता नाम का संकेत देना चाहिए।
पीआर-शादोको

3
  • कुछ विशेषताओं को परिभाषित करें

<declare-styleable name="refreshPullRefreshLayout">
        <attr name="refreshColors" format="reference"/>
        <attr name="refreshColor" format="reference"/>
</declare-styleable>
  • जैसे लेआउट फ़ाइल में इसका उपयोग करें

<com.aolphn.PullRefreshLayout
     app:refreshColor="@color/main_green"
     app:refreshColors="@array/refresh_color"/>
  • अंत में इसे स्टाइल फाइल में उपयोग करें

    शैली फ़ाइल और लेआउट फ़ाइल के बीच का अंतर यह है कि हम प्रीफ़िक्स को नहीं जोड़ते हैं app:
<style name="refreshStyle">
    <item name="refreshColor">@color/main_green</item>
    <item name="refreshColors">@array/refresh_color</item>
</style>

यह कोशिश करो, एक अच्छा दिन है, यह मेरे लिए काम करता है।


2

मामले में यह किसी और में मदद करता है, मेरी गलती है कि गया था मेरी कस्टम दृश्य वर्ग बुला रहा था AttributeSet.getAttributeValue जैसे

String fontName = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "customFont");

... जिसके परिणामस्वरूप मेरी कस्टम विशेषता मेरे कस्टम दृश्य के लिए नहीं पढ़ी जा रही थी।

फिक्स को obtainStyledAttributesमेरे कस्टम दृश्य में उपयोग करना था :

 TypedArray styleAttrs = context.obtainStyledAttributes(attrs, R.styleable.MyTextViewStyleable);
 String fontName = styleAttrs.getString(R.styleable.MyTextViewStyleable_customFont);

एक संकेत जो यह सही ढंग से काम कर रहा है कि आप Ctrl / Apple + पर क्लिक करके R.styleable.MyTextViewStyleable_customFontसीधे अपने attrs.xml परिभाषा में ले जा सकते हैं।

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

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