कस्टम दृश्य के लिए attrs.xml में समान-नाम वाली विशेषताएँ


180

मैं कुछ कस्टम विचार लिख रहा हूं जो कुछ समान नाम वाली विशेषताओं को साझा करते हैं। उनके संबंधित <declare-styleable>अनुभाग में attrs.xmlमैं विशेषताओं के लिए समान नामों का उपयोग करना चाहता हूं:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyView1">
        <attr name="myattr1" format="string" />
        <attr name="myattr2" format="dimension" />
        ...
    </declare-styleable>

    <declare-styleable name="MyView2">
        <attr name="myattr1" format="string" />
        <attr name="myattr2" format="dimension" />
        ...
    </declare-styleable>
</resources>

मुझे लगता है कि यह कहते हुए एक त्रुटि हो रही है myattr1और myattr2पहले ही निर्धारित कर। मैंने पाया कि मैं छोड़ देना चाहिए formatके लिए विशेषता myattr1और myattr2में MyView2है, लेकिन अगर मैं ऐसा, मैं कंसोल में निम्न त्रुटि प्राप्त:

[2010-12-13 23:53:11 - MyProject] ERROR: In <declare-styleable> MyView2, unable to find attribute 

क्या कोई ऐसा तरीका है जो मैं इसे पूरा कर सकता हूं, शायद किसी प्रकार का नामस्थान (केवल अनुमान लगा रहा है)?

जवाबों:


401

समाधान: दोनों दृष्टिकोणों से सामान्य विशेषताएँ निकालें और उन्हें सीधे <resources>नोड के बच्चों के रूप में जोड़ें :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="myattr1" format="string" />
    <attr name="myattr2" format="dimension" />

    <declare-styleable name="MyView1">
        <attr name="myattr1" />
        <attr name="myattr2" />
        ...
    </declare-styleable>

    <declare-styleable name="MyView2">
        <attr name="myattr1" />
        <attr name="myattr2" />
        ...
    </declare-styleable>
</resources>

11
क्या होता है जब myattr1स्ट्रिंग MyView1और पूर्णांक में स्ट्रिंग होती है MyView2?
foxx1337

4
मुझे ऐसा नहीं लगता है, उदाहरण के लिए हमारे पास 'अभिविन्यास' विशेषता हो सकती है और कुछ दृश्य के लिए यह 'क्षैतिज' / 'ऊर्ध्वाधर' और अन्य 'लैंडस्केप' / 'पोर्ट्रेट' / 'वर्ग' के लिए है। मेरे दृष्टिकोण से यह एंड्रॉइड में एक बग (या कम से कम असंगत व्यवहार) है (ध्यान रखें कि: 1. शैलीगत विशेषताएँ हमेशा उपसर्ग = दृश्य नाम और 2 से शुरू होती हैं। यदि आप इस तरह के विचारों के लिए अलग लाइब्रेरी प्रोजेक्ट बनाते हैं तो सब कुछ ठीक चलेगा। )
se.solovyev

4
जब मैं इस उत्तर का पालन करता हूं तो मुझे ERROR: In <declare-styleable> com_app_view_widget, unable to find attribute customAttr वह सभी दृश्य मिलता है जिसके लिए मैं घोषणा करने की कोशिश करता हूं। कोई विचार?
Dapp

45
@Google: क्रैपी डिज़ाइन
ग्लेन बेच

6
@ foxx1337 बस उपयोग करें <attr name="myattr1" format="string|integer" />। मेरे लिये कार्य करता है।
Mygod

58

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

  <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <!-- parent styleable -->
     <declare-styleable name="MyView">
         <attr name="myattr1" format="string" />
         <attr name="myattr2" format="dimension" />
     </declare-styleable>

     <!-- inheriting parent styleable -->
     <!-- also note "myBackgroundColor" belongs to child styleable"MyView1"-->
    <declare-styleable name="MyView1" parent="MyView">
        <attr name="myattr1" />
        <attr name="myattr2" />
        <attr name="myBackgroundColor" format="color"/>
    </declare-styleable>


    <!-- inheriting parent styleable -->
    <!-- same way here "myfonnt" belongs to child styelable "MyView2" -->
    <declare-styleable name="MyView2" parent="MyView">
        <attr name="myattr1" />
        <attr name="myattr2" />
        <attr name="myfont" format="string"/>
        ...
    </declare-styleable>
</resources>

यह मेरे लिए पूरी तरह से काम करता है। हमें एक अभिभावक को स्टाइल करने योग्य बनाने की आवश्यकता है और फिर हमें उस मूल शैली को विरासत में लाने की आवश्यकता है। उदाहरण के लिए, जैसा कि मैंने ऊपर किया है: मूल शैली नाम MyView और इसे क्रमशः MyView1 और MyView1 जैसी मेरी अन्य शैली के लिए विरासत में मिला है।


1
इसने मेरे लिए काम किया। मुझे स्वीकृत उत्तर से कोड में निकाली गई विशेषताओं को संदर्भित करने का कोई तरीका नहीं मिला।
नेमेनजा कोवेसेविक

हम्म .. अजीब है .. स्वीकृत समाधान मेरे लिए अच्छी तरह से काम कर रहा लगता है (targetSdkVersion 27)। हो सकता है क्योंकि "पाठ" जैसी विशेषताएँ आम हैं और कुछ अन्य attrs.xml में मौजूद हो सकती हैं ..?
आबा

मैंने एक ऐसे नाम के साथ प्रयास किया जो शायद सबसे असामान्य है और स्वीकृत समाधान अभी भी मेरे लिए काम करता है।
आबा

मैं पहली टिप्पणी से सहमत हूँ! टाइप किए गए एटरे से निकाले गए एटर को संदर्भित करने का कोई तरीका नहीं है। इसलिए यदि आप एक Styleable माता पिता परिभाषित करने की जरूरत
reavcn

काम करने के लिए इस के लिए माता-पिता में इस विशेषता और बच्चे में नहीं पता करने के लिए भूल जाते हैं नहीं है (वर्ग के लिए MyView2सही: R.styleable.MyView2_myattr1, गलत: R.styleable.MyView_myattr1)
vigilancer

28

जैसा कि प्रिया सिंघल ने उत्तर दिया, एंड्रॉइड स्टूडियो को सामान्य विशेषता नामों को अपने स्वयं के शैली के नाम से परिभाषित करने की आवश्यकता होती है। वे किसी भी अधिक मूल में नहीं हो सकते।

हालाँकि, कुछ अन्य बातों पर ध्यान देना चाहिए (इसीलिए मैं भी एक उत्तर जोड़ रहा हूँ):

  • आम शैलियों को एक दृश्य के रूप में एक ही चीज़ का नाम देने की आवश्यकता नहीं है। ( यह इंगित करने के लिए इस उत्तर के लिए धन्यवाद ।)
  • आपको माता-पिता के साथ विरासत का उपयोग करने की आवश्यकता नहीं है।

उदाहरण

यहां मैंने हाल ही में एक परियोजना में किया है जिसमें दो कस्टम विचार हैं जो दोनों समान विशेषताओं को साझा करते हैं। जब तक कस्टम दृश्य में अभी भी विशेषताओं के नाम हैं और इसमें शामिल नहीं हैं format, तब भी मैं कोड से उन्हें सामान्य रूप से एक्सेस कर सकता हूं।

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- common attributes to all custom text based views -->

    <declare-styleable name="TextAttributes">
        <attr name="text" format="string"/>
        <attr name="textSize" format="dimension"/>
        <attr name="textColor" format="color"/>
        <attr name="gravity">
            <flag name="top" value="48" />
            <flag name="center" value="17" />
            <flag name="bottom" value="80" />
        </attr>
    </declare-styleable>

    <!-- custom text views -->

    <declare-styleable name="View1">
        <attr name="text"/>
        <attr name="textSize"/>
        <attr name="textColor"/>
        <attr name="gravity"/>
    </declare-styleable>

    <declare-styleable name="View2">
        <attr name="text"/>
        <attr name="textSize"/>
        <attr name="textColor"/>
        <attr name="gravity"/>
    </declare-styleable>

</resources>

सुव्यवस्थित उदाहरण

वास्तव में, मुझे विशेषताओं को कस्टम नाम के तहत रखने की आवश्यकता नहीं है। जब तक मैं उन्हें परिभाषित करता हूं (उन्हें format) कम से कम एक कस्टम दृश्य के लिए, मैं उन्हें कहीं भी (बिना format) उपयोग कर सकता हूं । तो यह भी काम करता है (और क्लीनर दिखता है):

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="View1">
        <attr name="text" format="string"/>
        <attr name="textSize" format="dimension"/>
        <attr name="textColor" format="color"/>
        <attr name="gravity">
            <flag name="top" value="48" />
            <flag name="center" value="17" />
            <flag name="bottom" value="80" />
        </attr>
    </declare-styleable>

    <declare-styleable name="View2">
        <attr name="text"/>
        <attr name="textSize"/>
        <attr name="textColor"/>
        <attr name="gravity"/>
    </declare-styleable>

</resources>

एक बड़ी परियोजना के लिए, हालांकि, यह गड़बड़ हो सकता है और उन्हें एक ही स्थान पर शीर्ष पर परिभाषित करना बेहतर हो सकता है (जैसा कि यहां अनुशंसित है )।


विरासत में क्या गलत है? मेरे पास कस्टम दृश्य पदानुक्रम हैं, जो संबंधित स्टाइलस इस रिश्ते को प्रतिबिंबित नहीं करते हैं, जो केवल संबंधित स्टाइल परिभाषाओं में नामकरण परंपराओं और उसमें परिभाषित विशिष्ट वस्तुओं के द्वारा काटे जा सकते हैं (जिसमें यह देखते हुए कि कुछ एक शैलीगत और कुछ अन्य से संबंधित हैं)। मैं इसके बजाय इसे parentविशेषता के साथ स्पष्ट करूँगा, लेकिन कई पोस्टों को इसके उपयोग का सुझाव देते हुए नहीं देखा है।
समिस

@samis, मैंने कुछ समय के लिए इस पर काम नहीं किया है, लेकिन मैं उपयोग करने में कुछ भी गलत नहीं जानता हूं parent। मुझे लगता है कि मैं कह रहा था कि यह आवश्यक नहीं था।
सुरगाछ

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

8

धन्यवाद लुईस मुझे वही समस्या थी, और आपके वंशानुगत समाधान ने मुझे इसे नीचे की तरह करने के लिए संकेत दिया और यह ठीक काम करता है। मैंने बस ऊपर दिए गए सामान्य विशेषताओं को घोषित किया और इसे स्वरूपण के बिना फिर से शैली घोषणा के शरीर में फिर से लिखना। मुझे उम्मीद है कि यह किसी की मदद करता है

<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- common attributes -->
     <attr name="myattr1" format="string" />
     <attr name="myattr2" format="dimension" />

 <!-- also note "myBackgroundColor" belongs to child styleable"MyView1"-->
<declare-styleable name="MyView1" >
    <attr name="myattr1" />
    <attr name="myattr2" />
    <attr name="myBackgroundColor" format="color"/>
</declare-styleable>

<!-- same way here "myfonnt" belongs to child styelable "MyView2" -->
<declare-styleable name="MyView2" parent="MyView">
    <attr name="myattr1" />
    <attr name="myattr2" />
    <attr name="myfont" format="string"/>
    ...
</declare-styleable>


1

बस मामले में किसी को अभी भी उपलब्ध समाधान की कोशिश के बाद इस समस्या के साथ फंस गया। मैं प्रारूप के साथ जोड़ने की subtitleविशेषता के साथ अटक गया string

मेरा समाधान प्रारूप हटा रहा है।

इससे पहले:

<attr name="subtitle" format="string"/>

उपरांत:

<attr name="subtitle"/>

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