व्यू क्लास बनाना

लिखने का तरीका आज़माएं
Android के लिए, Jetpack Compose हमारा सुझाया गया यूज़र इंटरफ़ेस (यूआई) टूलकिट है. Compose में लेआउट इस्तेमाल करने का तरीका जानें.

अच्छी तरह से डिज़ाइन किया गया कस्टम व्यू, किसी भी अन्य अच्छी तरह से डिज़ाइन की गई क्लास की तरह ही होता है. यह एक का तय सेट के साथ-साथ एक आसान इंटरफ़ेस के साथ काम करती है, सीपीयू और मेमोरी का बेहतर ढंग से इस्तेमाल करती है वगैरह. तय सीमा में इसके अलावा, क्लास अच्छी तरह से डिज़ाइन की गई है, तो कस्टम व्यू को ये काम करने होंगे:

  • Android के मानकों के मुताबिक हों.
  • अपनी पसंद के मुताबिक स्टाइल किए जा सकने वाले एट्रिब्यूट उपलब्ध कराएं, जो Android एक्सएमएल लेआउट के साथ काम करते हों.
  • सुलभता से जुड़े इवेंट भेजें.
  • एक से ज़्यादा Android प्लैटफ़ॉर्म के साथ काम करना.

Android फ़्रेमवर्क, बेस क्लास और एक्सएमएल टैग का एक सेट उपलब्ध कराता है, ताकि आप ऐसा व्यू बना सकें जो इन सभी से मेल खाता है ज़रूरतें. इस लेसन में बताया गया है कि अपनी वेबसाइट के लिए, Android फ़्रेमवर्क का इस्तेमाल व्यू की सुविधा क्लास.

ज़्यादा जानकारी के लिए, कस्टम व्यू कॉम्पोनेंट में मौजूद जानकारी.

किसी व्यू को सब-क्लास बनाना

Android फ़्रेमवर्क में बताई गई सभी व्यू क्लास बड़ी हैं View. आपका कस्टम व्यू से भी View को सीधे विस्तृत करें या आप यह कर सकते हैं समय बचाने के लिए, मौजूदा व्यू सब-क्लास, जैसे कि Button.

Android Studio को अपने व्यू से इंटरैक्ट करने की अनुमति देने के लिए, कम से कम आपको एक ऐसा कंस्ट्रक्टर उपलब्ध कराना होगा जो Context और AttributeSet ऑब्जेक्ट, पैरामीटर के तौर पर. यह कंस्ट्रक्टर, लेआउट एडिटर को आपके व्यू का इंस्टेंस बनाने और उसमें बदलाव करने की अनुमति देता है.

Kotlin

class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs)

Java

class PieChart extends View {
    public PieChart(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
}

कस्टम एट्रिब्यूट तय करना

अपने यूज़र इंटरफ़ेस में बिल्ट-इन View जोड़ने के लिए, एक्सएमएल एलिमेंट में इसकी जानकारी दें और इसे कंट्रोल करो दिखने और काम करने का तरीका एलिमेंट एट्रिब्यूट का इस्तेमाल करें. आपके पास कस्टम ऐसेट जोड़ने और स्टाइल देने का विकल्प है एक्सएमएल का इस्तेमाल करके व्यू बढ़ाना चाहते हैं. यहां की यात्रा पर हूं तो अपने कस्टम व्यू में इस व्यवहार को चालू करने के लिए, ये काम करें:

  • <declare-styleable> रिसॉर्स एलिमेंट में, अपने व्यू के लिए कस्टम एट्रिब्यूट तय करें.
  • अपने एक्सएमएल लेआउट में एट्रिब्यूट के लिए वैल्यू सेट करें.
  • रनटाइम के दौरान विशेषता मान वापस पाएं.
  • अपने व्यू में, वापस लाई गई एट्रिब्यूट की वैल्यू लागू करें.

इस सेक्शन में कस्टम एट्रिब्यूट तय करने और उनकी वैल्यू तय करने के तरीके के बारे में बताया गया है. अगले सेक्शन में शामिल है रनटाइम पर वैल्यू को वापस पाने और लागू करने से.

कस्टम एट्रिब्यूट तय करने के लिए, अपने प्रोजेक्ट में <declare-styleable> संसाधन जोड़ें. इन संसाधनों को पूरी तरह से res/values/attrs.xml फ़ाइल. यह रहा attrs.xml फ़ाइल का उदाहरण:

<resources>
   <declare-styleable name="PieChart">
       <attr name="showText" format="boolean" />
       <attr name="labelPosition" format="enum">
           <enum name="left" value="0"/>
           <enum name="right" value="1"/>
       </attr>
   </declare-styleable>
</resources>

यह कोड दो कस्टम एट्रिब्यूट, showText और labelPosition का एलान करता है, जो अलग-अलग स्टाइल से जुड़ी होती हैं. इकाई का नाम PieChart है. शैली के हिसाब से इकाई का नाम एक जैसा है नाम क्लास का नाम जो कस्टम व्यू के बारे में बताता है. हालांकि, इस कन्वेंशन का पालन करना ज़रूरी नहीं है, लेकिन कई लोकप्रिय कोड एडिटर, स्टेटमेंट को पूरा करने के लिए नाम रखने के इस तरीके पर निर्भर रहते हैं.

एक बार कस्टम एट्रिब्यूट तय कर देने के बाद, उनका इस्तेमाल लेआउट एक्सएमएल फ़ाइलों में ठीक वैसे ही किया जा सकता है जैसे पहले से मौजूद था एट्रिब्यूट. सिर्फ़ अंतर यह है कि आपके कस्टम एट्रिब्यूट किसी दूसरे नेमस्पेस से जुड़े हैं. अपनेपन के बजाय http://schemas.android.com/apk/res/android नेमस्पेस से जुड़े हुए हैं, तो वे http://schemas.android.com/apk/res/[your package name] से जुड़े हैं. उदाहरण के लिए, यहां बताया गया है कि इसके लिए तय किए गए एट्रिब्यूट PieChart:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:custom="http://schemas.android.com/apk/res-auto">
 <com.example.customviews.charting.PieChart
     custom:showText="true"
     custom:labelPosition="left" />
</LinearLayout>

लंबे नेमस्पेस यूआरआई को दोहराने से बचने के लिए, सैंपल किसी xmlns डायरेक्टिव. यह डायरेक्टिव, custom उपनाम को इन्हें असाइन करता है नाम स्थान http://schemas.android.com/apk/res/com.example.customviews. अपने नेमस्पेस के लिए कोई भी उपनाम चुना जा सकता है.

उस एक्सएमएल टैग का नाम देखें जो लेआउट में कस्टम व्यू जोड़ता है. यह पूरी तरह से उस कंपनी का नाम कस्टम व्यू क्लास. अगर आपके व्यू की क्लास इनर क्लास है, तो उसे और क्वालिफ़ाई करें व्यू की आउटर क्लास का नाम डालें. उदाहरण के लिए, PieChart क्लास की PieView नाम की एक इनर क्लास है. टूल का इस्तेमाल करने के लिए इस श्रेणी की कस्टम विशेषताएं, आपको com.example.customviews.charting.PieChart$PieView टैग का इस्तेमाल करें.

कस्टम एट्रिब्यूट लागू करना

जब किसी एक्सएमएल लेआउट से कोई व्यू बनाया जाता है, तो एक्सएमएल टैग के सभी एट्रिब्यूट को पढ़ लिया जाता है संसाधन से बंडल बनाया और व्यू के कंस्ट्रक्टर में AttributeSet. हालांकि, यह सीधे AttributeSet से वैल्यू को पढ़ा जा सकता है. ऐसा करने से इसके कुछ नुकसान हैं:

  • एट्रिब्यूट की वैल्यू में मौजूद संसाधन के रेफ़रंस ठीक नहीं किए गए हैं.
  • शैलियां लागू नहीं की जाती हैं.

इसके बजाय, AttributeSet को obtainStyledAttributes(). इस तरीके से TypedArray अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है का कलेक्शन वे वैल्यू जो संदर्भ के साथ-साथ उनकी पहचान कर चुके हैं.

Android रिसॉर्स कंपाइलर की मदद से, कई तरह से कॉल किए जा सकते हैं obtainStyledAttributes() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है और भी आसान हो गया है. हर <declare-styleable> के लिए res/ डायरेक्ट्री में मौजूद संसाधन है, तो जनरेट किया गया R.java एट्रिब्यूट की कैटगरी, दोनों के बारे में बताता है आईडी और वे कॉन्सटेंट जो कैटगरी में मौजूद हर एट्रिब्यूट के लिए इंडेक्स तय करते हैं. आप पहले से तय पढ़ने के लिए स्थिरांक TypedArray से एट्रिब्यूट. इसका तरीका यहां बताया गया है PieChart क्लास इसकी विशेषताएं पढ़ता है:

Kotlin

init {
    context.theme.obtainStyledAttributes(
            attrs,
            R.styleable.PieChart,
            0, 0).apply {

        try {
            mShowText = getBoolean(R.styleable.PieChart_showText, false)
            textPos = getInteger(R.styleable.PieChart_labelPosition, 0)
        } finally {
            recycle()
        }
    }
}

Java

public PieChart(Context context, AttributeSet attrs) {
   super(context, attrs);
   TypedArray a = context.getTheme().obtainStyledAttributes(
        attrs,
        R.styleable.PieChart,
        0, 0);

   try {
       mShowText = a.getBoolean(R.styleable.PieChart_showText, false);
       textPos = a.getInteger(R.styleable.PieChart_labelPosition, 0);
   } finally {
       a.recycle();
   }
}

ध्यान दें कि TypedArray ऑब्जेक्ट एक शेयर संसाधन हैं और उसे इस्तेमाल के बाद रीसाइकल किया जाना चाहिए.

प्रॉपर्टी और इवेंट जोड़ें

एट्रिब्यूट का इस्तेमाल करके, व्यू के व्यवहार और लुक को कंट्रोल किया जा सकता है. हालांकि, उन्हें सिर्फ़ पढ़ा जा सकता है जब व्यू शुरू होता है. डाइनैमिक बिहेवियर उपलब्ध कराने के लिए, प्रॉपर्टी गैटर दिखाएं और हर एक के लिए सेटर की जोड़ी कस्टम एट्रिब्यूट. नीचे दिया गया स्निपेट यह दिखाता है कि PieChart किसी प्रॉपर्टी को कैसे दिखाता है इस नंबर showText को कॉल किया गया:

Kotlin

fun isShowText(): Boolean {
    return mShowText
}

fun setShowText(showText: Boolean) {
    mShowText = showText
    invalidate()
    requestLayout()
}

Java

public boolean isShowText() {
   return mShowText;
}

public void setShowText(boolean showText) {
   mShowText = showText;
   invalidate();
   requestLayout();
}

ध्यान दें कि setShowText, invalidate() को कॉल करता है और requestLayout(). ये कॉल ज़रूरी हैं ताकि यह पक्का किया जा सके कि व्यू भरोसेमंद तरीके से काम करे. आपको इनकी ज़रूरत होगी की प्रॉपर्टी में किसी भी बदलाव के बाद व्यू को अमान्य किया जा सकता है. ताकि सिस्टम जानता है कि इसे फिर से बनाने की ज़रूरत है. इसी तरह, अगर आपको नए लेआउट का अनुरोध करना है, तो प्रॉपर्टी में दूसरे तरीके से जो व्यू के साइज़ या आकार पर असर डाल सकती हैं. इन तरीकों से किए गए कॉल को भूलने की वजह से ढूंढना मुश्किल गड़बड़ियां.

कस्टम व्यू में, इवेंट लिसनर भी शामिल होने चाहिए, ताकि ज़रूरी इवेंट के बारे में लोगों को बताया जा सके. इसके लिए इंस्टेंस, PieChart सुनने वालों को यह सूचना देने के लिए OnCurrentItemChanged नाम के एक कस्टम इवेंट दिखाता है उपयोगकर्ता ने उसे घुमाया पाई चार्ट की नई स्लाइस पर फ़ोकस करें.

प्रॉपर्टी और इवेंट को दिखाना भूलना आसान है, खास तौर पर जब आप अकेले उपयोगकर्ता हों कस्टम व्यू का इस्तेमाल कर सकते हैं. अपने व्यू के इंटरफ़ेस को ध्यान से तय करने में समय लगता है. इससे, आने वाले समय के रखरखाव में कमी आती है लागत. पालन करने का एक अच्छा नियम यह है कि ऐसी प्रॉपर्टी को हमेशा बिना अनुमति के सार्वजनिक किया जाए जिसका असर उसके दिखने या काम करने का तरीका आपका कस्टम व्यू.

सुलभता के लिए डिज़ाइन

पसंद के मुताबिक बनाए गए व्यू में, ज़्यादा से ज़्यादा उपयोगकर्ताओं को शामिल किया जाना चाहिए. इसमें ये लोग शामिल हैं दिव्यांगता उन्हें टचस्क्रीन देखने या उनका इस्तेमाल करने से रोक सकता है. दिव्यांग उपयोगकर्ताओं की मदद करने के लिए, ये काम करें:

  • android:contentDescription का इस्तेमाल करके, अपने इनपुट फ़ील्ड को लेबल करें एट्रिब्यूट की वैल्यू सबमिट करें.
  • sendAccessibilityEvent() पर कॉल करके सुलभता इवेंट भेजें ज़रूरत पड़ने पर.
  • डी-पैड या ट्रैकबॉल जैसे वैकल्पिक नियंत्रकों के साथ काम किया जा सकता है.

ऐक्सेस किए जा सकने वाले व्यू बनाने के बारे में ज़्यादा जानकारी के लिए, यह देखें ऐप्लिकेशन को ज़्यादा सुलभ बनाएं.