जवाबों:
मान लीजिए कि आप समान हैं जो विचारों का एक समूह उत्पन्न करते हैं। आप OnClickListener
प्रत्येक दृश्य के लिए व्यक्तिगत रूप से सेट कर सकते हैं :
button1.setOnClickListener(new OnClickListener ... );
button2.setOnClickListener(new OnClickListener ... );
...
फिर आपको onClick
प्रत्येक दृश्य के लिए एक अनूठा तरीका बनाना होगा, भले ही वे समान चीजें करें, जैसे:
public void onClick(View v) {
doAction(1); // 1 for button1, 2 for button2, etc.
}
ऐसा इसलिए है क्योंकि onClick
केवल एक पैरामीटर है View
, और इसे एन्कोडिंग स्कोप्स में उदाहरण चर या अंतिम स्थानीय चर से अन्य जानकारी प्राप्त करनी है। हम वास्तव में क्या चाहते हैं , विचारों से स्वयं जानकारी प्राप्त करना है ।
दर्ज getTag
/ setTag
:
button1.setTag(1);
button2.setTag(2);
अब हम हर बटन के लिए एक ही OnClickListener का उपयोग कर सकते हैं:
listener = new OnClickListener() {
@Override
public void onClick(View v) {
doAction(v.getTag());
}
};
यह मूल रूप से विचारों को याद रखने का एक तरीका है ।
public void ui_click(View view){ if(20==((int)view.getTag())) view.setBackgroundColor(colorInt); }
रंग वाले भाग के लिए टोटका करना चाहिए। 20 आपके दृश्य की मान्य स्थिति के लिए एक प्लेसहोल्डर है।
मैं कुछ शब्द जोड़ना चाहूंगा।
यद्यपि get/setTag(Object)
व्यूहबोर्ड पैटर्न के विशेष मामले में उपयोग करना बहुत उपयोगी लगता है, फिर भी मैं अन्य मामलों में उपयोग करने से पहले दो बार सोचने की सलाह दूंगा। बेहतर डिजाइन के साथ लगभग हमेशा एक और समाधान होता है।
मुख्य कारण यह है कि कोड की तरह है कि बहुत जल्दी असमर्थित हो जाता है।
यह अन्य डेवलपर्स के लिए गैर-स्पष्ट है जिसे आपने दृश्य में टैग के रूप में संग्रहीत करने के लिए डिज़ाइन किया है। विधियाँ setTag/getTag
वर्णनात्मक नहीं हैं।
यह सिर्फ एक स्टोर करता है Object
, जिसे जब आप चाहते हैं तो कास्ट करने की आवश्यकता होती है getTag
। जब आप टैग में संग्रहीत ऑब्जेक्ट के प्रकार को बदलने का निर्णय लेते हैं तो आप बाद में अप्रत्याशित क्रैश प्राप्त कर सकते हैं।
यहां एक वास्तविक जीवन की कहानी है: हमारे पास बहुत सारे एडेप्टर के साथ एक बहुत बड़ी परियोजना थी, विचारों के साथ एसिंक्स संचालन और इतने पर। एक डेवलपर ने set/getTag
अपने कोड के हिस्से में फैसला किया , लेकिन दूसरे ने पहले ही इस दृश्य को टैग सेट कर दिया था। अंत में, कोई व्यक्ति अपना टैग नहीं ढूंढ सका और बहुत उलझन में था। बग को खोजने में हमें कई घंटे लगे।
setTag(int key, Object tag)
बहुत बेहतर लग रहा है, क्योंकि आप हर टैग ( आईडी संसाधनों का उपयोग करके ) के लिए अद्वितीय कुंजी उत्पन्न कर सकते हैं , लेकिन एंड्रॉइड <4.0 के लिए एक महत्वपूर्ण प्रतिबंध है। लिंट डॉक्स से:
Android 4.0 से पहले, View.setTag (int, Object) के कार्यान्वयन से वस्तुओं को स्थैतिक मानचित्र में संग्रहीत किया जाएगा, जहाँ मानों को दृढ़ता से संदर्भित किया गया था। इसका मतलब यह है कि यदि ऑब्जेक्ट में संदर्भ में वापस इंगित करने वाला कोई संदर्भ है, तो संदर्भ (जो कि बहुत अधिक सब कुछ इंगित करता है) लीक होगा। यदि आप एक दृश्य पास करते हैं, तो दृश्य उस संदर्भ का संदर्भ प्रदान करता है जिसने इसे बनाया था। इसी तरह, व्यू होल्डर्स में आम तौर पर एक दृश्य होता है, और कर्सर कभी-कभी विचारों से भी जुड़े होते हैं।
हम अपनी आवश्यकता के अनुसार कस्टम ऑब्जेक्ट का उपयोग setTag()
और getTag()
सेट और प्राप्त कर सकते हैं । setTag()
विधि प्रकार का एक तर्क लेता Object
है, और getTag()
एक रिटर्न Object
।
उदाहरण के लिए,
Person p = new Person();
p.setName("Ramkailash");
p.setId(2000001);
button1.setTag(p);
यह कस्टम ArrayAdapter
का उपयोग करने के लिए बहुत उपयोगी है । यह किसी प्रकार का अनुकूलन है। वहाँ setTag
वस्तु के संदर्भ के रूप में इस्तेमाल कि लेआउट के कुछ भागों पर संदर्भ (में प्रदर्शित कि ListView
बजाय) findViewById
।
static class ViewHolder {
TextView tvPost;
TextView tvDate;
ImageView thumb;
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = myContext.getLayoutInflater();
convertView = inflater.inflate(R.layout.postitem, null);
ViewHolder vh = new ViewHolder();
vh.tvPost = (TextView)convertView.findViewById(R.id.postTitleLabel);
vh.tvDate = (TextView)convertView.findViewById(R.id.postDateLabel);
vh.thumb = (ImageView)convertView.findViewById(R.id.postThumb);
convertView.setTag(vh);
}
....................
}
आईडी के विपरीत, टैग का उपयोग विचारों की पहचान करने के लिए नहीं किया जाता है। टैग अनिवार्य रूप से सूचना का एक अतिरिक्त टुकड़ा है जिसे एक दृश्य के साथ जोड़ा जा सकता है। वे अक्सर एक अलग संरचना में डालने के बजाय विचारों में विचारों से संबंधित डेटा को स्टोर करने की सुविधा के रूप में उपयोग किए जाते हैं।
संदर्भ: http://developer.android.com/reference/android/view/View.html
TAG की सेटिंग वास्तव में तब उपयोगी होती है जब आपके पास एक सूची दृश्य होता है और विचारों को पुन: चक्रित / पुन: उपयोग करना चाहता है। उस तरह से ListView नए RecyclerView के समान होता जा रहा है।
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder = null;
if ( convertView == null )
{
/* There is no view at this position, we create a new one.
In this case by inflating an xml layout */
convertView = mInflater.inflate(R.layout.listview_item, null);
holder = new ViewHolder();
holder.toggleOk = (ToggleButton) convertView.findViewById( R.id.togOk );
convertView.setTag (holder);
}
else
{
/* We recycle a View that already exists */
holder = (ViewHolder) convertView.getTag ();
}
// Once we have a reference to the View we are returning, we set its values.
// Here is where you should set the ToggleButton value for this item!!!
holder.toggleOk.setChecked( mToggles.get( position ) );
return convertView;
}