View的setTag()getTag()方法的主要目的是什麼?

View類型對象的setTag()getTag()等方法的主要用途是什麼? html

我是否正確地認爲我能夠將任意數量的對象與單個視圖相關聯? android


#1樓

這對於使用自定義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);
    }
            ....................
}

#2樓

我想補充幾句話。 佈局

雖然在特定的ViewHolder模式中使用get/setTag(Object)彷佛很是有用,但我建議在其餘狀況下使用它以前要三思然後行。 幾乎老是有另外一個好的設計解決方案。 post

主要緣由是代碼很快就變得不受支持了。 優化

  • 對於其餘開發人員而言,您設計爲在視圖中存儲爲標記的內容並不明顯。 方法setTag / getTag根本不具備描述性。 spa

  • 它只存儲一個Object ,因此當你想要getTag時它須要getTag 。 當您決定更改標記中存儲對象的類型時,您可能會在之後遇到意外崩潰。 設計

  • 這是來自現實生活的故事。 咱們有一個很是大的項目,包含不少適配器,帶有視圖的異步操做等等。 一位開發人員決定在他的部分代碼中set/getTag ,但另外一位開發人員已經爲此視圖設置了標記。 最後有人找不到本身的標籤並且很是困惑。 花了咱們幾個小時來找到這個bug。 code

setTag(int key, Object tag)看起來好多了,由於你能夠爲每一個標籤生成惟一的密鑰(使用id資源 ),但Android <4.0存在重大限制。 來自Lint文檔: htm

在Android 4.0以前,View.setTag(int,Object)的實現會將對象存儲在靜態映射中,其中值被強烈引用。 這意味着若是對象包含指向上下文的任何引用,則上下文(指向其餘全部內容)將泄漏。 若是傳遞視圖,視圖將提供對建立它的上下文的引用。 相似地,視圖持有者一般包含視圖,而遊標有時也與視圖相關聯。


#3樓

對於Web開發人員來講,這彷佛等同於數據 - ..


#4樓

與ID不一樣,標籤不用於標識視圖。 標籤本質上是能夠與視圖相關聯的額外信息。 它們一般用做存儲與視圖自己中的視圖相關的數據的便利,而不是將它們放在單獨的結構中。

參考: http//developer.android.com/reference/android/view/View.html


#5樓

咱們可使用setTag()getTag()根據咱們的要求設置和獲取自定義對象。 setTag()方法接受Object類型的參數, getTag()返回一個Object

例如,

Person p = new Person();
p.setName("Ramkailash");
p.setId(2000001);
button1.setTag(p);
相關文章
相關標籤/搜索