xml - एक्सएमएल का उपयोग कर एक कस्टम एंड्रॉइड यूआई तत्व घोषित करना




android user-interface (4)

एक्सएमएल का उपयोग करके मैं एंड्रॉइड यूआई तत्व कैसे घोषित करूं?


अधिकतर वोट किए गए उत्तर में वृद्धि।

obtainStyledAttributes ()

मैं getStyledAttributes () उपयोग के बारे में कुछ शब्द जोड़ना चाहता हूं, जब हम एंड्रॉइड का उपयोग करके कस्टम व्यू बनाते हैं: xxx prdefined विशेषताएँ। विशेष रूप से जब हम TextAppearance का उपयोग करते हैं।
जैसा कि "2. रचनाकार बनाना" में उल्लेख किया गया था, कस्टम व्यू को इसके निर्माण पर विशेषता सेट प्राप्त होता है। मुख्य उपयोग हम टेक्स्ट व्यू स्रोत कोड (एपीआई 16) में देख सकते हैं।

final Resources.Theme theme = context.getTheme();

// TextAppearance is inspected first, but let observe it later

TypedArray a = theme.obtainStyledAttributes(
            attrs, com.android.internal.R.styleable.TextView, defStyle, 0);

int n = a.getIndexCount();
for (int i = 0; i < n; i++) 
{
    int attr = a.getIndex(i);
    // huge switch with pattern value=a.getXXX(attr) <=> a.getXXX(a.getIndex(i))
}
a.recycle();

हम यहाँ क्या देख सकते हैं?
obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes)
प्रलेखन के अनुसार थीम सेट द्वारा थीम सेट संसाधित किया जाता है। विशेषता मान चरण-दर-चरण संकलित किए जाते हैं। पहले गुण विषय से भरे हुए हैं, फिर मानों को शैली से मूल्यों द्वारा प्रतिस्थापित किया जाता है, और अंत में एक्सएमएल से विशेष दृश्य उदाहरण के लिए सटीक मान दूसरों को प्रतिस्थापित करते हैं।
अनुरोधित विशेषताओं का ऐरे - com.android.internal.R.styleable.TextView
यह स्थिरांक की एक साधारण सरणी है। अगर हम मानक विशेषताओं का अनुरोध कर रहे हैं, तो हम इस सरणी को मैन्युअल रूप से बना सकते हैं।

दस्तावेज़ीकरण में क्या उल्लेख नहीं किया गया है - परिणाम टाइपेडअरे तत्वों का क्रम।
जब attrs.xml में कस्टम व्यू घोषित किया जाता है, विशेषता इंडेक्स के लिए विशेष स्थिरांक उत्पन्न होते हैं। और हम इस तरह से मूल्य निकाल सकते हैं: a.getString(R.styleable.MyCustomView_android_text) । लेकिन मैनुअल int[] लिए कोई स्थिरांक नहीं हैं। मुझे लगता है कि ,XXXXValue (arrayIndex) ठीक काम करेगा।

और दूसरा सवाल यह है: "हम आंतरिक स्थिरांक को कैसे बदल सकते हैं, और मानक विशेषताओं का अनुरोध कर सकते हैं?" हम android.R.attr। * मानों का उपयोग कर सकते हैं।

इसलिए यदि हम कस्टम व्यू में मानक टेक्स्ट एपियरेंस विशेषता का उपयोग करना चाहते हैं और कन्स्ट्रक्टर में इसके मानों को पढ़ना चाहते हैं, तो हम टेक्स्ट व्यू से कोड को इस तरह संशोधित कर सकते हैं:

ColorStateList textColorApp = null;
int textSize = 15;
int typefaceIndex = -1;
int styleIndex = -1;

Resources.Theme theme = context.getTheme();

TypedArray a = theme.obtainStyledAttributes(attrs, R.styleable.CustomLabel, defStyle, 0);
TypedArray appearance = null;
int apResourceId = a.getResourceId(R.styleable.CustomLabel_android_textAppearance, -1);
a.recycle();
if (apResourceId != -1)
{
    appearance = 
        theme.obtainStyledAttributes(apResourceId, new int[] { android.R.attr.textColor, android.R.attr.textSize, 
            android.R.attr.typeface, android.R.attr.textStyle });
}
if (appearance != null)
{
    textColorApp = appearance.getColorStateList(0);
    textSize = appearance.getDimensionPixelSize(1, textSize);
    typefaceIndex = appearance.getInt(2, -1);
    styleIndex = appearance.getInt(3, -1);

    appearance.recycle();
}

जहां कस्टम लेबल परिभाषित किया गया है:

<declare-styleable name="CustomLabel">
    <!-- Label text. -->
    <attr name="android:text" />
    <!-- Label text color. -->
    <attr name="android:textColor" />
    <!-- Combined text appearance properties. -->
    <attr name="android:textAppearance" />
</declare-styleable>

शायद, मुझे कुछ तरीकों से गलती हो रही है, लेकिन प्राप्त स्टाइल एट्रिब्यूट्स () पर एंड्रॉइड प्रलेखन बहुत खराब है।

मानक यूआई घटक विस्तार

साथ ही हम अपने सभी घोषित विशेषताओं का उपयोग करके मानक यूआई घटक भी बढ़ा सकते हैं। यह दृष्टिकोण इतना अच्छा नहीं है, क्योंकि टेक्स्टव्यू उदाहरण के लिए बहुत सारी संपत्तियों की घोषणा करता है। और ओवरराइड ऑन मेजर () और ऑन ड्रा () पर पूर्ण कार्यक्षमता को कार्यान्वित करना असंभव होगा।

लेकिन हम कस्टम घटक के सैद्धांतिक व्यापक पुन: उपयोग का त्याग कर सकते हैं। कहें "मुझे पता है कि मैं वास्तव में कौन सी विशेषताओं का उपयोग करूंगा", और किसी के साथ कोड साझा न करें।

फिर हम कन्स्ट्रक्टर CustomComponent(Context, AttributeSet, defStyle) को कार्यान्वित कर सकते हैं। super(...) कॉल करने के बाद हमारे पास गेटटर विधियों के माध्यम से पार्स किए गए सभी उपलब्ध होंगे।


आप अन्य लेआउट फ़ाइल में किसी लेआउट फ़ाइल को शामिल कर सकते हैं-

             <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="30dp" >

                <include
                    android:id="@+id/frnd_img_file"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    layout="@layout/include_imagefile"/>

                <include
                    android:id="@+id/frnd_video_file"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    layout="@layout/include_video_lay" />

                <ImageView
                    android:id="@+id/downloadbtn"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:layout_centerInParent="true"
                    android:src="@drawable/plus"/>
            </RelativeLayout>

यहां लेआउट फाइलों में टैग शामिल हैं, एक ही res फ़ोल्डर में अन्य .xml लेआउट फ़ाइलें हैं।


ऐसा लगता है कि Google ने अपने डेवलपर पृष्ठ को अपडेट किया है और वहां विभिन्न प्रशिक्षण जोड़े हैं।

उनमें से एक कस्टम विचारों के निर्माण से संबंधित है और here पाया जा सकता here


पहले जवाब के लिए बहुत बहुत धन्यवाद।

मेरे लिए, मुझे इसके साथ सिर्फ एक समस्या थी। मेरे विचार को फुलाते समय , मेरे पास एक बग था: java.lang.NoSuchMethodException: MyView (संदर्भ, विशेषताएँ)

मैंने इसे एक नया कन्स्ट्रक्टर बनाकर हल किया:

public MyView(Context context, AttributeSet attrs) {
     super(context, attrs);
     // some code
}

उम्मीद है कि यह मदद करेगा!





user-interface