सेटटैग () गेटटैग () देखने के तरीकों का मुख्य उद्देश्य क्या है?


421

के रूप में इस तरह के तरीकों का मुख्य उद्देश्य क्या है setTag()और getTag()के Viewप्रकार वस्तुओं?

क्या मैं यह सोचने में सही हूं कि मैं किसी भी संख्या को किसी एक दृश्य से जोड़ सकता हूं?

जवाबों:


636

मान लीजिए कि आप समान हैं जो विचारों का एक समूह उत्पन्न करते हैं। आप 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());
    }
};

यह मूल रूप से विचारों को याद रखने का एक तरीका है ।


8
@ मैथ्यू विलिस लेकिन हम ऐसा कर सकते हैं कि view.getId () का उपयोग कर सकते हैं। ऐसा नहीं है ?
एंड्रॉइड किलर

50
@AndroidKiller आप कर सकते हैं, लेकिन सेटटैग () के साथ आप अपनी इच्छानुसार कोई भी वस्तु डाल सकते हैं, यहां तक ​​कि कस्टम वर्ग भी - तो आप उनका उपयोग उस डेटा के संदर्भ को बनाए रखने के लिए कर सकते हैं जिसे दृश्य प्रदर्शित कर रहा है
डैनियल

अगर मुझे केवल उस बटन का बैकग्राउंड कलर बदलना है जो मुझे क्लिक करना है तो मुझे क्या करना चाहिए ??? मैं getTag () द्वारा स्थिति प्राप्त कर रहा हूं।
सागर देवांग

2
@ सागर: public void ui_click(View view){ if(20==((int)view.getTag())) view.setBackgroundColor(colorInt); }रंग वाले भाग के लिए टोटका करना चाहिए। 20 आपके दृश्य की मान्य स्थिति के लिए एक प्लेसहोल्डर है।
रीवा

मुझे लगता है कि यह पुराना तरीका है। नया तरीका सामान्य तर्कों का उपयोग करना है जो प्रकार की सुरक्षा प्रदान करता है। लेकिन फिर भी यह अच्छा है।
एम। केज़म अखगीरी

124

मैं कुछ शब्द जोड़ना चाहूंगा।

यद्यपि get/setTag(Object)व्यूहबोर्ड पैटर्न के विशेष मामले में उपयोग करना बहुत उपयोगी लगता है, फिर भी मैं अन्य मामलों में उपयोग करने से पहले दो बार सोचने की सलाह दूंगा। बेहतर डिजाइन के साथ लगभग हमेशा एक और समाधान होता है।

मुख्य कारण यह है कि कोड की तरह है कि बहुत जल्दी असमर्थित हो जाता है।

  • यह अन्य डेवलपर्स के लिए गैर-स्पष्ट है जिसे आपने दृश्य में टैग के रूप में संग्रहीत करने के लिए डिज़ाइन किया है। विधियाँ setTag/getTagवर्णनात्मक नहीं हैं।

  • यह सिर्फ एक स्टोर करता है Object, जिसे जब आप चाहते हैं तो कास्ट करने की आवश्यकता होती है getTag। जब आप टैग में संग्रहीत ऑब्जेक्ट के प्रकार को बदलने का निर्णय लेते हैं तो आप बाद में अप्रत्याशित क्रैश प्राप्त कर सकते हैं।

  • यहां एक वास्तविक जीवन की कहानी है: हमारे पास बहुत सारे एडेप्टर के साथ एक बहुत बड़ी परियोजना थी, विचारों के साथ एसिंक्स संचालन और इतने पर। एक डेवलपर ने set/getTagअपने कोड के हिस्से में फैसला किया , लेकिन दूसरे ने पहले ही इस दृश्य को टैग सेट कर दिया था। अंत में, कोई व्यक्ति अपना टैग नहीं ढूंढ सका और बहुत उलझन में था। बग को खोजने में हमें कई घंटे लगे।

setTag(int key, Object tag)बहुत बेहतर लग रहा है, क्योंकि आप हर टैग ( आईडी संसाधनों का उपयोग करके ) के लिए अद्वितीय कुंजी उत्पन्न कर सकते हैं , लेकिन एंड्रॉइड <4.0 के लिए एक महत्वपूर्ण प्रतिबंध है। लिंट डॉक्स से:

Android 4.0 से पहले, View.setTag (int, Object) के कार्यान्वयन से वस्तुओं को स्थैतिक मानचित्र में संग्रहीत किया जाएगा, जहाँ मानों को दृढ़ता से संदर्भित किया गया था। इसका मतलब यह है कि यदि ऑब्जेक्ट में संदर्भ में वापस इंगित करने वाला कोई संदर्भ है, तो संदर्भ (जो कि बहुत अधिक सब कुछ इंगित करता है) लीक होगा। यदि आप एक दृश्य पास करते हैं, तो दृश्य उस संदर्भ का संदर्भ प्रदान करता है जिसने इसे बनाया था। इसी तरह, व्यू होल्डर्स में आम तौर पर एक दृश्य होता है, और कर्सर कभी-कभी विचारों से भी जुड़े होते हैं।


2
धन्यवाद, बहुत मददगार! ... क्या आपको पता है कि टैग में क्या है, गतिविधि मनोरंजन के बीच बहाल हो जाता है?
गनर

25

हम अपनी आवश्यकता के अनुसार कस्टम ऑब्जेक्ट का उपयोग setTag()और getTag()सेट और प्राप्त कर सकते हैं । setTag()विधि प्रकार का एक तर्क लेता Objectहै, और getTag()एक रिटर्न Object

उदाहरण के लिए,

Person p = new Person();
p.setName("Ramkailash");
p.setId(2000001);
button1.setTag(p);

20

वेब डेवलपर्स के लिए, यह डेटा के बराबर लगता है- ।।


14

यह कस्टम 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);
    }
            ....................
}

13

आईडी के विपरीत, टैग का उपयोग विचारों की पहचान करने के लिए नहीं किया जाता है। टैग अनिवार्य रूप से सूचना का एक अतिरिक्त टुकड़ा है जिसे एक दृश्य के साथ जोड़ा जा सकता है। वे अक्सर एक अलग संरचना में डालने के बजाय विचारों में विचारों से संबंधित डेटा को स्टोर करने की सुविधा के रूप में उपयोग किए जाते हैं।

संदर्भ: http://developer.android.com/reference/android/view/View.html


11

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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.