সেটটিগ () গেটট্যাগ () দেখার পদ্ধতির মূল উদ্দেশ্য কী?


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);

এখন আমরা প্রতিটি বোতামের জন্য একই অনক্লিকলিস্টনার ব্যবহার করতে পারি:

listener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        doAction(v.getTag());
    }
};

এটি দেখার জন্য স্মৃতি ধারণের মূলত একটি উপায় ।


8
@ ম্যাথু উইলিস তবে আমরা ভিউ.জেটআইডি () ব্যবহার করে এটিও করতে পারি। তাই না?
অ্যান্ড্রয়েড কিলার

50
অ্যান্ড্রয়েড কিলার আপনি পেরেছিলেন, কিন্তু সেটট্যাগ দিয়ে () আপনি যে কোনও বস্তু এমনকি কাস্টম ক্লাসও রাখতে পারেন - যাতে আপনি প্রদর্শন করা ডেটার রেফারেন্স ধরে রাখতে তাদের ব্যবহার করতে পারেন
ড্যানিয়েল

আমি যদি ক্লিক করা বাটনটির পটভূমির রঙ পরিবর্তন করতে চাই তবে আমি কী করব ??? আমি গেটটাগ () দ্বারা পজিশন পাচ্ছি।
সাগর দেবঙ্গা

2
@ সাগর: public void ui_click(View view){ if(20==((int)view.getTag())) view.setBackgroundColor(colorInt); }রঙ অংশের জন্য কৌশলটি করা উচিত। 20 আপনার দেখার বৈধতা পজিশনের জন্য কেবল স্থানধারক।
রিয়া

আমার মনে হয় এটি পুরানো পথ। নতুন উপায় হ'ল জেনেরিক আর্গুমেন্টগুলি ব্যবহার করা যা ধরণের সুরক্ষা সরবরাহ করে। তবে এটি তবুও ভাল।
এমকাজেম আখগারি

124

আমি কয়েকটি শব্দ যুক্ত করতে চাই।

যদিও ব্যবহার get/setTag(Object)একটি ViewHolder প্যাটার্ন নির্দিষ্ট ক্ষেত্রে খুব দরকারী হবে বলে মনে হয়, আমি অন্যান্য ক্ষেত্রে এটি ব্যবহার করার পূর্বে আরেকবার ভেবে কথা বলতে চাই। আরও প্রায়শই আরও ভাল ডিজাইন সহ আরও একটি সমাধান রয়েছে।

মূল কারণটি হল যে এর মতো কোডটি খুব দ্রুতই অসমর্থিত হয়ে যায়।

  • আপনি ভিউ হিসাবে ট্যাগ হিসাবে সঞ্চয় করার জন্য যা নকশা করেছেন তা অন্য বিকাশকারীদের পক্ষে এটি স্পষ্ট নয়। পদ্ধতিগুলি setTag/getTagমোটেই বর্ণনামূলক নয়।

  • এটি কেবলমাত্র একটি সঞ্চয় করে Object, যা আপনি যখন চান তখন কাস্ট করা প্রয়োজন getTag। আপনি ট্যাগে সঞ্চিত বস্তুর ধরণের পরিবর্তন করার সিদ্ধান্ত নেওয়ার পরে আপনি অপ্রত্যাশিত ক্র্যাশ পেতে পারেন।

  • এখানে একটি বাস্তব জীবনের গল্প: আমাদের কাছে অনেকগুলি অ্যাডাপ্টার, ভিউ সহ অ্যাসিঙ্ক অপারেশন সহ একটি দুর্দান্ত একটি প্রকল্প ছিল। একজন বিকাশকারী set/getTagতার কোডের অংশে সিদ্ধান্ত নিয়েছেন , কিন্তু অন্য একজন ইতিমধ্যে ট্যাগটি এই ভিউতে সেট করেছেন। শেষ অবধি, কেউ নিজের ট্যাগ খুঁজে না পেয়ে খুব বিভ্রান্ত হয়ে পড়েছিল। বাগটি খুঁজে পেতে আমাদের বেশ কয়েক ঘন্টা ব্যয় করেছে।

setTag(int key, Object tag)আরও ভাল দেখাচ্ছে, কারণ আপনি প্রতিটি ট্যাগের জন্য অনন্য কী উত্পন্ন করতে পারবেন ( আইডি সংস্থান ব্যবহার করে ) তবে অ্যান্ড্রয়েড <4.0 এর জন্য উল্লেখযোগ্য বাধা রয়েছে। লিন্ট ডক্স থেকে:

অ্যান্ড্রয়েড 4.0.০ এর আগে ভিউ.সেটট্যাগ (ইনট, অবজেক্ট) বাস্তবায়ন বস্তুগুলিকে একটি স্ট্যাটিক মানচিত্রে সংরক্ষণ করবে, যেখানে মানগুলি দৃ strongly়ভাবে উল্লেখ করা হয়েছিল। এর অর্থ হ'ল যদি অবজেক্টটিতে প্রসঙ্গটি নির্দেশ করে কোনও রেফারেন্স থাকে তবে কনটেক্সট (যা বেশ কিছু কিছুকে নির্দেশ করে) ফাঁস হয়ে যাবে। আপনি যদি কোনও ভিউ পাস করেন, দৃশ্যটি এটি তৈরি করা প্রসঙ্গে একটি রেফারেন্স সরবরাহ করে। একইভাবে, ভিউ হোল্ডারগুলিতে সাধারণত একটি ভিউ থাকে এবং কার্সারগুলি কখনও কখনও ভিউগুলির সাথেও যুক্ত থাকে।


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/references/android/view/View.html


11

আপনার তালিকার ভিউ থাকাকালীন এবং ভিউগুলিকে পুনর্ব্যক্ত / পুনঃব্যবহার করতে চাইলে ট্যাগগুলি সেট করা সত্যই কার্যকর। সেভাবে তালিকাগুলিটি নতুন পুনর্ব্যক্তিকল্পের সাথে খুব মিলছে।

@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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.