2014-08-27 34 views
6
public void setTag(final Object tag) { 
       mTag = tag; 
} 
public Object getTag() { 
      return mTag; 
} 

這些是Android中View Class的兩種方法。 以下是這兩種方法的官方文檔。Android:View類中的getTag()和setTag()的用途

/** 
    * Returns this view's tag. 
    * 
    * @return the Object stored in this view as a tag 
    * 
    * @see #setTag(Object) 
    * @see #getTag(int) 


     */ 
/** 
    * Sets the tag associated with this view. A tag can be used to mark 
    * a view in its hierarchy and does not have to be unique within the 
    * hierarchy. Tags can also be used to store data within a view without 
    * resorting to another data structure. 
    * 
    * @param tag an Object to tag the view with 
    * 
    * @see #getTag() 
    * @see #setTag(int, Object) 
    */ 

標記函數廣泛用於baseadapter實現,但我無法理解它的目的以及如何使用它們。你能解釋一下這個很好的例子來幫助我理解這些功能的作用嗎?

+0

可能重複(HTTP://計算器。 COM /問題/ 5291726 /什麼 - 是最主要目的 - 的 - settag-gettag的方法的視圖) – rds 2015-06-22 11:52:11

回答

8

想的那樣的清楚簡單,因爲它是可能的 - 一個「標籤」。

雜貨店產品標籤告訴你什麼? 基本上有很多東西,比如名字,價格,出身國,折扣等等。

想象一下,您正在製作一個應用程序,使用ImageView的網格顯示此類產品。 如何輕鬆確定ImageView的產品功能?標記它是可能的解決方案之一。

class Product { 

    String mName; 
    String mManufacturer; 
    String mOriginCountry; 

    double mPrice; 
    int mDiscount; 

    int mImageId; // A reference to a drawable item id 
} 

[...] 

class My Activity { 

    @Override 
    protected void onCreate() { 
     [...] // Some code 

     // Grab the imageView reference and grab (or create) the tag for it 
     ImageView someItemView = (ImageView) findViewById(R.id.some_product_view); 
     Product someProductTag = new Product(... some data ...); 

     // Add the tag to the ImageView 
     someItemView.addTag(someProductTag); 
    } 

    private void displayItemInfo(ImageView iv) { 

     // Grab the tag and display the info. 
     String productName = ((Product)iv.getTag()).mName(); 
     Toast.show(mContext, "This is " + productName, Toast.LONG).show(); 

    } 

} 

當然,這是非常簡化。理想情況下,您需要一個適配器,它可以根據您提供的標籤創建視圖,或者自動創建您的標籤。

我希望你的想法

1

它們只是一種將Object附加到視圖的方法。
在BaseAdapter中,它用於存儲視圖ID以避免每次系統請求視圖時執行昂貴的findViewById操作。

0

標記字段是存儲您自己的任何視圖類的狀態信息的好方法。一種用途是將視圖的位置存儲在ListView中。例如,請參閱此answer

2

一個很好的例子是View Holder模式。一個實現可以在ListViews的this tutorial中找到。

查看持有者模式允許避免適配器中的findViewById()方法。

ViewHolder類是適配器中的靜態內部類,它持有對相關視圖的引用。在你的佈局。通過setTag()方法將此引用作爲標籤分配給行視圖。

如果我們收到一個convertView對象,我們可以通過getTag()方法獲取ViewHolder的實例,並通過ViewHolder引用將新屬性分配給視圖。

雖然這聽起來很複雜,但使用findViewById()方法的速度要快大約15%。

示例

下面的代碼示出了重複使用現有的視圖,並實現了保持器圖案的性能優化的適配器實現。它

import android.app.Activity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class MyPerformanceArrayAdapter extends ArrayAdapter<String> { 
    private final Activity context; 
    private final String[] names; 

    static class ViewHolder { 
    public TextView text; 
    public ImageView image; 
    } 

    public MyPerformanceArrayAdapter(Activity context, String[] names) { 
    super(context, R.layout.rowlayout, names); 
    this.context = context; 
    this.names = names; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    View rowView = convertView; 
    // reuse views 
    if (rowView == null) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     rowView = inflater.inflate(R.layout.rowlayout, null); 
     // configure view holder 
     ViewHolder viewHolder = new ViewHolder(); 
     viewHolder.text = (TextView) rowView.findViewById(R.id.TextView01); 
     viewHolder.image = (ImageView) rowView 
      .findViewById(R.id.ImageView01); 
     rowView.setTag(viewHolder); 
    } 

    // fill data 
    ViewHolder holder = (ViewHolder) rowView.getTag(); 
    String s = names[position]; 
    holder.text.setText(s); 
    if (s.startsWith("Windows7") || s.startsWith("iPhone") 
     || s.startsWith("Solaris")) { 
     holder.image.setImageResource(R.drawable.no); 
    } else { 
     holder.image.setImageResource(R.drawable.ok); 
    } 

    return rowView; 
    } 
} 
1

setTag(int, object)是用於存儲自定義類的觀點非常有用的。這裏是我的實施:

itemView.setTag(R.id.food_tag, food); 

變量食物是一個自定義對象食物的實例。 setTag的關鍵應始終是一個資源ID。

我可以檢索該自定義對象這種方式在OnClickListener():[?))什麼是setTag的主要目的(getTag(查看方法]的

Food selectedFood = (Food) view.getTag(R.id.food_tag); 
相關問題