एंड्रॉइड - कस्टम विशेषताओं के साथ कस्टम यूआई


113

मुझे पता है कि कस्टम UI तत्व (व्यू या विशिष्ट UI तत्व एक्सटेंशन के माध्यम से) बनाना संभव है। लेकिन क्या नए बनाए गए UI तत्वों के लिए नए गुणों या विशेषताओं को परिभाषित करना संभव है (मेरा मतलब विरासत में नहीं है, लेकिन कुछ विशिष्ट व्यवहार को परिभाषित करने के लिए बिल्कुल नया हूं जो मैं डिफ़ॉल्ट प्रॉम्प्टिस या विशेषताओं के साथ संभाल नहीं पा रहा हूं)

उदाहरण के लिए मेरा कस्टम तत्व:

<com.tryout.myCustomElement
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="Element..."
   android:myCustomValue=<someValue>
/>

तो क्या MyCustomValue को परिभाषित करना संभव है ?

धन्यवाद



अरे यहाँ आप Android में कस्टम विशेषताओं के बारे में कुछ अच्छा लेख है - amcmobileware.org/android/blog/2016/09/11/custom-attributes
Arkadiusz Cieśliński

इस संबंधित प्रश्न पर मेरे उत्तर पर एक नज़र डालें ।
हेलिओस

जवाबों:


258

हाँ। लघु गाइड:

1. एक विशेषता XML बनाएँ

/res/values/attrs.xmlविशेषता के साथ अंदर एक नई XML फ़ाइल बनाएँ , और यह टाइप है

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <declare-styleable name="MyCustomElement">
        <attr name="distanceExample" format="dimension"/>
    </declare-styleable>
</resources>

मूल रूप से आपको <declare-styleable />अपने दृश्य के लिए एक सेट करना होगा जिसमें आपकी सभी कस्टम विशेषताएँ (यहाँ सिर्फ एक है)। मुझे संभावित प्रकारों की पूरी सूची कभी नहीं मिली, इसलिए आपको मेरे एक अनुमान के लिए स्रोत को देखने की जरूरत है। प्रकार जो मुझे पता है कि संदर्भ (दूसरे संसाधन के लिए) हैं, रंग, बूलियन, आयाम, फ्लोट, पूर्णांक और स्ट्रिंग । वे बहुत आत्म-व्याख्यात्मक हैं

2. अपने लेआउट में विशेषताओं का उपयोग करें

वह उसी तरह काम करता है जैसा आपने ऊपर किया था, एक अपवाद के साथ। आपके कस्टम विशेषता की आवश्यकता है कि यह XML नाम स्थान का अपना हो।

<com.example.yourpackage.MyCustomElement
   xmlns:customNS="http://schemas.android.com/apk/res/com.example.yourpackage"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="Element..."
   customNS:distanceExample="12dp"
   />

बहुत सीधा।

3. आपके द्वारा पास किए गए मूल्यों का उपयोग करें

मूल्यों को पार्स करने के लिए अपने कस्टम दृश्य के निर्माता को संशोधित करें।

public MyCustomElement(Context context, AttributeSet attrs) {
    super(context, attrs);

    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyCustomElement, 0, 0);
    try {
        distanceExample = ta.getDimension(R.styleable.MyCustomElement_distanceExample, 100.0f);
    } finally {
        ta.recycle();
    }
    // ...
}

distanceExampleइस उदाहरण में एक निजी सदस्य चर है। TypedArrayअन्य प्रकार के मूल्यों को पार्स करने के लिए बहुत सी अन्य चीजें मिलीं।

और बस। Viewइसे संशोधित करने के लिए अपने पार्स किए गए मान का उपयोग करें , उदाहरण के onDraw()अनुसार रूप बदलने के लिए इसका उपयोग करें ।


7
बस TypedArray के बारे में ध्यान दें। उनके साथ होने पर रीसायकल () को कॉल करना सुनिश्चित करें।
zskalnik

यहाँ आप एक अच्छा सूची प्राप्त कर सकते github.com/android/platform_frameworks_base/blob/master/core/...
याह्या

क्या आईडीई (उदाहरण के लिए ग्रहण) कस्टम विशेषताओं की कुंजी / मूल्यों को स्वतः पूर्ण करता है?
AlikElzin-kilaka

23
ग्रेडेल के लिए आपको http://schemas.android.com/apk/res-autoकस्टम नेमस्पेस घोषित करते समय उपयोग करना चाहिए
डोरी

2
चरण 3 में, आप बस उपयोग कर सकते हैं String initialText = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "initialText");जहां Attr AttributeSet है जो कि कंस्ट्रक्टर में पास किया गया है और 'initialText' आपका कस्टम विशेषता नाम है
kosiara - Bartosz Kosarzycki

21

अपने रेस / मान फ़ोल्डर में attr.xml बनाएँ। वहाँ आप अपने गुणों को परिभाषित कर सकते हैं:

<declare-styleable name="">
    <attr name="myCustomValue" format="integer/boolean/whatever" />
</declare-styleable>

जब आप तब इसे अपनी लेआउट फ़ाइल में उपयोग करना चाहते हैं तो आपको जोड़ना होगा

xmlns:customname="http://schemas.android.com/apk/res/your.package.name"

और तब आप के साथ मान का उपयोग कर सकते हैं customname:myCustomValue=""


यह जवाब नहीं है, सवाल यह है कि जावा से प्रोग्रामेटिक रूप से कैसे बदलना है
फजल

-11

हाँ, आप कर सकते हैं <resource>। बस टैग का उपयोग करें ।
इस तरह:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
    </style>
</resources>

आधिकारिक वेबसाइट से लिंक


उत्तर के लिए धन्यवाद। लेकिन संसाधन में, मैं डिफ़ॉल्ट "एंड्रॉइड:" मानों का उपयोग कर रहा हूं। मेरी बात है, क्या मेरे पास एंड्रॉइड हो सकता है: phoneNameSelected = "true" मेरे कस्टम UI तत्व के पैरामीटर के रूप में?
वेपइंट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.