2013-08-22 7 views
65

मैं एक कस्टम दृश्य बनाई में attrs.xml में बन जाता है पाने के लिए प्रकार enum का एक घोषणा-Styleable विशेषता के साथ। एक्सएमएल में अब मैं अपने कस्टम एट्रिब्यूट के लिए एनम प्रविष्टियों में से एक चुन सकता हूं। अब मैं इस मान को प्रोग्रामेटिक रूप से सेट करने के लिए एक विधि बनाना चाहता हूं, लेकिन मैं enum तक नहीं पहुंच सकता। mCustomView.setIcon(R.id.enum_name_x); लेकिन मैं नहीं enum पा सकते हैं या मैं भी पता नहीं है:(इसे खोजने <a href="https://bitbucket.org/informatic0re/awesome-font-iconview" rel="nofollow noreferrer">here</a>) कैसे एक enum जो कोड

attr.xml

<declare-styleable name="IconView"> 
    <attr name="icon" format="enum"> 
     <enum name="enum_name_one" value="0"/> 
     .... 
     <enum name="enum_name_n" value="666"/> 
    </attr> 
</declare-styleable>  

layout.xml

<com.xyz.views.IconView 
    android:id="@+id/heart_icon" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    app:icon="enum_name_x"/> 

क्या मैं जरूरत है कुछ की तरह है मैं enum या enum के नाम कैसे प्राप्त कर सकते हैं।

धन्यवाद

उत्तर

63

वहाँ एक विशेषता enum से एक जावा enum प्राप्त करने के लिए एक स्वचालित तरीका हो प्रतीत नहीं होता है - जावा में आप संख्यात्मक मान आपके द्वारा निर्दिष्ट प्राप्त कर सकते हैं - स्ट्रिंग (एक्सएमएल फाइल में इस्तेमाल के लिए है आप के रूप में प्रदर्शन)।

आप अपने दृश्य निर्माता में ऐसा कर सकता है:

TypedArray a = context.getTheme().obtainStyledAttributes(
       attrs, 
       R.styleable.IconView, 
       0, 0); 

    // Gets you the 'value' number - 0 or 666 in your example 
    if (a.hasValue(R.styleable.IconView_icon)) { 
     int value = a.getInt(R.styleable.IconView_icon, 0)); 
    } 

    a.recycle(); 
} 

आप एक enum में मूल्य तुम अपने आप को Enum या तो एक जावा में मूल्य मैप करने के लिए की आवश्यकता होगी, जैसे चाहते हैं:

private enum Format { 
    enum_name_one(0), enum_name_n(666); 
    int id; 

    Format(int id) { 
     this.id = id; 
    } 

    static Format fromId(int id) { 
     for (Format f : values()) { 
      if (f.id == id) return f; 
     } 
     throw new IllegalArgumentException(); 
    } 
} 

तो पहले कोड ब्लॉक में आप इस्तेमाल कर सकते हैं:

Format format = Format.fromId(a.getInt(R.styleable.IconView_icon, 0))); 

(हालांकि यह पी में एक अपवाद फेंक ओंट एक समझदार डिफ़ॉल्ट मान चुनने के लिए शायद एक अच्छा विचार नहीं हो सकता है)

7

सैनिटी के लिए अच्छा है। सुनिश्चित करें कि आपके नियम आपके घोषित शैली में समान हैं जैसा कि आपके एनम घोषणा में है और इसे सरणी के रूप में एक्सेस करें।

TypedArray a = context.getTheme().obtainStyledAttributes(
        attrs, 
        R.styleable.IconView, 
        0, 0); 

int ordinal = a.getInt(R.styleable.IconView_icon, 0); 

if (ordinal >= 0 && ordinal < MyEnum.values().length) { 
     enumValue = MyEnum.values()[ordinal]; 
} 
+0

मुझे लगता है कि यहां पर enum ordinals पर भरोसा अविश्वसनीय कोड बनाने के लिए नियत है। एक चीज अपडेट हो जाएगी, न कि दूसरी और फिर आपको परेशानी होगी। – tir38

2

मुझे पता है कि सवाल पोस्ट होने के बाद से कुछ समय हो गया है, लेकिन मुझे हाल ही में एक ही समस्या थी। मैंने एक साथ कुछ ऐसा हैक किया जो स्क्वायर के जावापेट का उपयोग करता है और build.gradle में कुछ सामान जो स्वचालित रूप से प्रोजेक्ट बिल्ड पर attrs.xml से जावा एनम क्लास बनाता है।

वहाँ एक छोटे से प्रदर्शन और https://github.com/afterecho/create_enum_from_xml

पर एक विवरण के साथ एक रीडमी आशा है कि यह मदद करता है है।

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

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