7

मान लीजिए कि मैं स्टाइल करने योग्य विशेषताओं के साथ कुछ नए विचार कर रहा हूं। मैं घोषणा उन्हें thusly (इस how the documentation says to do it है:घोषित करने योग्य शैली का क्या मतलब है?

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

    <declare-styleable name="TriangleView"> 
     <attr name="direction"> 
      <enum name="NE" value="0" /> 
      <enum name="NW" value="1" /> 
      <enum name="SW" value="2" /> 
      <enum name="SE" value="3" /> 
     </attr> 
    </declare-styleable> 

    <declare-styleable name="BannerView"> 
     <attr name="direction"> 
      <enum name="NE" value="0" /> 
      <enum name="NW" value="1" /> 
      <enum name="SW" value="2" /> 
      <enum name="SE" value="3" /> 
     </attr> 
     <attr name="thickness" format="dimension" /> 
    </declare-styleable> 
</resources> 

हालांकि, इस वजह से सभी विशेषताओं में एक ही नाम स्थान में जाहिरा तौर पर कर रहे हैं काम नहीं करेगा, और मैं त्रुटि Error: Attribute "direction" has already been defined मिल

तो जाहिरा तौर पर मैं आगे बढ़ना है। <declare-styleable> इस तरह बाहर जाहिरा तौर पर दोहराया गुण:

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


    <attr name="direction"> 
     <enum name="NE" value="0" /> 
     <enum name="NW" value="1" /> 
     <enum name="SW" value="2" /> 
     <enum name="SE" value="3" /> 
    </attr> 

    <declare-styleable name="BannerView"> 
     <attr name="thickness" format="dimension" /> 
    </declare-styleable> 
</resources> 

लेकिन यह दो सवाल बन गया है:

  1. यदि यह काम करता है, तो <declare-styleable> का बिंदु क्या है?
  2. यदि मैं अलग-अलग विचारों में अलग-अलग व्यवहार करना चाहता हूं तो क्या होगा? उदाहरण के लिए यदि BannerView की दिशा केवल up या down हो सकती है।

उत्तर

15

<declare-styleable> का बिंदु बिल्कुल क्या है?

<declare-stylable> टैग्स आपको अपने कस्टम विचारों के लिए विशेषताओं की घोषणा करने देते हैं जिन्हें आप एक्सएमएल में उन विचारों के लिए सेट कर सकते हैं।

  1. एक <declare-stylable> टैग के अंदर एक <attr> घोषित: वहाँ वास्तव में विशेषता का उपयोग करने के लिए 3 हिस्से हैं।
  2. अपने ऐप पैकेज नाम (उदा। app) पर इशारा करते हुए अपने एक्सएमएल लेआउट में एक कस्टम नेमस्पेस परिभाषित करें। अपने लेआउट में कस्टम विशेषता का उपयोग करें (उदा। app:direction="NW")।
  3. अपने कस्टम व्यू में, AttributeSet पैरामीटर के साथ रचनाकारों को ओवरराइड करें, TypedArray प्राप्त करें और कस्टम विशेषताएँ, यदि कोई हो, तो इसे पढ़ें और फिर कन्स्ट्रक्टर के भीतर देखें कि उन विशेषताओं का उचित उपयोग कैसे करें।

यदि मैं अलग-अलग विचारों में अलग-अलग व्यवहार करना चाहता हूं तो क्या होगा? उदाहरण के लिए यदि बैनर व्यू की दिशा केवल ऊपर या नीचे हो सकती है। इस तरह

कोशिश कुछ:

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

    <attr name="direction"> 
     <enum name="NE" value="0" /> 
     <enum name="NW" value="1" /> 
     <enum name="SW" value="2" /> 
     <enum name="SE" value="3" /> 
    </attr> 

    <declare-styleable name="TriangleView"> 
     <attr name="direction" /> 
    </declare-styleable> 

    <declare-styleable name="BannerView"> 
     <attr name="direction" /> 
     <attr name="thickness" format="dimension" /> 
    </declare-styleable> 
</resources> 

जब आप TriangleView या BannerView के लिए अपने XML लेआउट का निर्माण, आप दोनों के लिए app:direction="NW" उदाहरण का उपयोग कर सकते हैं। TriangleView या BannerView में AttributeSet साथ कंस्ट्रक्टर में, विशेषताओं मूल रूप में एक ही प्रारूप है, लेकिन क्या आप करना कि मूल्य के साथ प्रत्येक संबंधित ध्यान में रखते हुए कंस्ट्रक्टर्स के अपने कार्यान्वयन पर निर्भर है होगा (एक ही हो सकता है या दोनों के लिए अलग)।

यदि आप परिभाषित अलग-अलग (यानी।विभिन्न विचारों के लिए अलग "प्रारूप" या "enum"), तो आपको अलग-अलग नामों के साथ अलग-अलग विशेषताओं को बनाना होगा।

+0

बहुत बढ़िया, वास्तव में ऐप-कंपैट लिब में परिभाषित एफ़आर के लिए भी मेरी मदद की! तो यह मूल रूप से है, यदि कोई एटीआर पहले ही परिभाषित किया गया है, तो इसे प्रारूप को ओवरराइड करने की कोशिश किए बिना घोषणा-शैली में उपयोग किया जाना चाहिए। कूल शांत ठंडा। – Redwarp

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

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