दिलचस्प पोस्ट
पायथन के लिए Exif हेरफेर लाइब्रेरी PHP में सुरक्षित यादृच्छिक संख्या पीढ़ी नाम से डेटा फ्रेम कॉलम ड्रॉप करें क्रॉस-डोमेन कुकीज एक MySQL तालिका में डालें या अपडेट करें MySQL में पुनरावर्ती चयन क्वेरी कैसे करें? स्कैनर विधि को चार अक्षर प्राप्त करने के लिए कैसे जावा में एक अवधि को प्रारूपित करें? (जैसे प्रारूप एच: एमएम: एसएस) स्ट्रिंग में पायथन के अंदर मैं एक वैरिएबल कैसे डालूं? जावा में फ़ाइल परिवर्तित श्रोता अनुमति केवल सिस्टम ऐप के लिए दी गई है अनक्यूट रेफरेंसएअर: फ़ंक्शन को ऑनक्लिक के साथ परिभाषित नहीं किया गया है UUID कितना अनूठा है? घोंसले के ब्लॉक स्तर तत्व <p> टैग … सही या गलत? mysqli: क्या यह एक कथन में कई क्वेरी तैयार कर सकता है?

XML का उपयोग करके एक कस्टम एंड्रॉयड UI तत्व घोषित करना

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

वेब के समाधान से एकत्रित समाधान "XML का उपयोग करके एक कस्टम एंड्रॉयड UI तत्व घोषित करना"

एंड्रॉइड डेवलपर गाइड में एक खंड है जिसे बिल्डिंग कस्टम कंटेनेंट कहा जाता है। दुर्भाग्य से, एक्सएमएल गुणों की चर्चा केवल लेआउट फ़ाइल के अंदर नियंत्रण की घोषणा करने के लिए कवर करती है और वास्तव में क्लास इनिशियलाइज़ेशन के भीतर मूल्यों को संभालना नहीं है। इस प्रकार हैं:

1. values\attrs.xml में विशेषताएँ घोषित करें

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyCustomView"> <attr name="android:text"/> <attr name="android:textColor"/> <attr name="extraInformation" format="string" /> </declare-styleable> </resources> 

declare-styleable टैग में एक अयोग्य नाम के उपयोग की सूचना दें गैर-मानक एंड्रॉइड विशेषताएँ जैसे कि extraInformation को उनके प्रकार घोषित करने की आवश्यकता है। सुपरक्लास में घोषित टैग उप-क्लासेस में पुनः उपलब्ध कराए बिना उपलब्ध होंगे।

2. कन्स्ट्रक्टर बनाएं

चूंकि दो कंस्ट्रक्टर हैं जो आरंभीकरण के लिए AttributeSet उपयोग करते हैं, इसलिए कंसल्टेंट्स को कॉल करने के लिए एक अलग इनिशियलीजेशन विधि बनाने के लिए सुविधाजनक है।

 private void init(AttributeSet attrs) { TypedArray a=getContext().obtainStyledAttributes( attrs, R.styleable.MyCustomView); //Use a Log.i("test",a.getString( R.styleable.MyCustomView_android_text)); Log.i("test",""+a.getColor( R.styleable.MyCustomView_android_textColor, Color.BLACK)); Log.i("test",a.getString( R.styleable.MyCustomView_extraInformation)); //Don't forget this a.recycle(); } 

R.styleable.MyCustomView एक autogenerated int[] संसाधन है जहां प्रत्येक तत्व एक विशेषता का आईडी है। एट्रिब्यूट नाम के गुण नाम को जोड़कर एक्सएमएल में प्रत्येक प्रॉपर्टी के लिए गुण उत्पन्न होते हैं उदाहरण के लिए, R.styleable.MyCustomView_android_text में R.styleable.MyCustomView_android_text लिए android_text विशेषता है गुणों को फिर से विभिन्न कार्यों के उपयोग के द्वारा TypedArray गए TypedArray से प्राप्त किया जा सकता है। यदि विशेषता को एक्सएमएल में परिभाषित नहीं किया गया है, तो null लौटा है सिवाय बेशक, यदि वापसी का प्रकार एक आदिम है, तो उस मामले में दूसरा तर्क वापस किया जाता है।

यदि आप सभी विशेषताओं को पुनः प्राप्त नहीं करना चाहते हैं, तो यह मैन्युअल रूप से इस सरणी को बनाने के लिए संभव है। मानक Android विशेषताओं के लिए आईडी को R.attrR.attr में शामिल किया गया है, जबकि इस प्रोजेक्ट के लिए विशेषता R.attrR.attr

 int attrsWanted[]=new int[]{android.R.attr.text, R.attr.textColor}; 

कृपया ध्यान दें कि android.R.styleable में आपको कुछ भी उपयोग नहीं करना चाहिए। android.R.styleable , इस धागे के अनुसार यह भविष्य में बदल सकता है। यह अभी भी प्रलेखन में है कि एक ही स्थान पर इन सभी स्थिरों को देखने के लिए उपयोगी है।

3. layout\main.xml जैसे लेआउट फ़ाइलों में इसका इस्तेमाल करें

नाम स्थान घोषणा xmlns:app="http://schemas.android.com/apk/res-auto" शामिल करें xmlns:app="http://schemas.android.com/apk/res-auto" शीर्ष स्तर xml तत्व में नामस्थान उन विवादों से बचने के लिए एक विधि प्रदान करते हैं जो कभी-कभी तब होते हैं जब अलग-अलग स्कीमा एक ही तत्व के नाम का उपयोग करते हैं (अधिक जानकारी के लिए यह आलेख देखें)। यूआरएल बस विशिष्ट रूप से पहचानने वाली स्कीमाओं का एक तरीका है – उस URL पर कुछ भी होस्ट करने की आवश्यकता नहीं है यदि यह कुछ भी नहीं दिखाई देता है, तो इसका कारण यह है कि आपको वास्तव में नाम स्थान उपसर्ग जोड़ने की आवश्यकता नहीं है, जब तक आपको किसी विरोध को हल करने की आवश्यकता नहीं होती।

 <com.mycompany.projectname.MyCustomView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@android:color/transparent" android:text="Test text" android:textColor="#FFFFFF" app:extraInformation="My extra information" /> 

पूरी तरह से योग्य नाम का उपयोग करके कस्टम दृश्य का संदर्भ लें।

Android LabelView नमूना

यदि आप एक पूर्ण उदाहरण चाहते हैं, तो एंड्रॉइड लेबल दृश्य नमूना देखें।

LabelView.java

  TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView); CharSequences=a.getString(R.styleable.LabelView_text); 

attrs.xml

 <declare-styleable name="LabelView"> <attr name="text"format="string"/> <attr name="textColor"format="color"/> <attr name="textSize"format="dimension"/> </declare-styleable> 

custom_view_1.xml

 <com.example.android.apis.view.LabelView android:background="@drawable/blue" android:layout_width="fill_parent" android:layout_height="wrap_content" app:text="Blue" app:textSize="20dp"/> 

यह एक नेम-स्पेस विशेषता के साथ एक LinearLayout में निहित है: xmlns:app="http://schemas.android.com/apk/res-auto"

लिंक

  • स्टैक ओवरफ्लो थ्रेड: कस्टम नियंत्रण के लिए एक XML विशेषता पुनर्प्राप्त करना
  • एंड्रॉइड के आंतरिक विषयों के साथ मैं स्टाइल स्टाइल प्राप्त कैसे करूं?
  • कस्टम विशेषताएँ + समर्थित विशेषता प्रारूपों की सूची को परिभाषित करना

महान संदर्भ धन्यवाद! इसके लिए एक अतिरिक्त:

यदि आपके पास कोई लाइब्रेरी प्रोजेक्ट शामिल होता है जिसमें कस्टम व्यू के लिए कस्टम विशेषताएँ घोषित की गई हैं, तो आपको अपनी प्रोजेक्ट नेमस्पेस घोषित करना होगा, लाइब्रेरी का कोई भी नहीं। उदाहरण के लिए:

यह देखते हुए कि पुस्तकालय में पैकेज "com.example.library.customview" है और काम करने वाले प्रोजेक्ट में "com.example.customview" पैकेज है, उसके बाद:

काम नहीं करेगा (त्रुटि दिखाता है "त्रुटि: विशेषता के लिए कोई संसाधन पहचानकर्ता नहीं मिला 'पैकेज' com.example.library.customview '' में 'newAttr'):

 <com.library.CustomView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res/com.example.library.customview" android:id="@+id/myView" app:newAttr="value" /> 

काम करेगा:

 <com.library.CustomView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res/com.example.customview" android:id="@+id/myView" app:newAttr="value" /> 

अधिकतर वोट वाले उत्तर में वृद्धि

obtainStyledAttributes ()

जब मैं एंड्रॉइड का उपयोग करते हुए कस्टम व्यू बना देता हूं तो मैं स्टाइलएटएट्यूब () उपयोग प्राप्त करने के बारे में कुछ शब्द जोड़ना चाहता हूं: xxx prdefined विशेषताएँ खासकर जब हम टेक्स्ट एपपरेंस का उपयोग करते हैं
जैसा कि "2. निर्माता बनाना" में वर्णित है, कस्टम दृश्य को इसके निर्माण पर AttributeSet मिलता है मुख्य उपयोग हम TextView स्रोत कोड (एपीआई 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
यह स्थिरांक की एक साधारण सरणी है अगर हम मानक विशेषताओं का अनुरोध कर रहे हैं, तो हम मैन्युअल रूप से इस सरणी का निर्माण कर सकते हैं।

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

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

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

 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> 

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

मानक UI घटक विस्तारित करना

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

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

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

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

उनमें से एक कस्टम विचारों के सृजन के साथ काम करता है और यहां यहां पाया जा सकता है

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

मेरे लिए, इसके साथ मुझे एक समस्या थी। जब मेरा दृश्य बढ़ता है , तो मुझे एक बग था: java.lang.NoSuchMethodException: MyView (प्रसंग, गुण)

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

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

आशा है कि इससे मदद मिलेगी!

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

  <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 लेआउट फ़ाइलें हैं