SetTag()的getTag()方法的主要目的是什么?

View类型对象的setTag()getTag()等方法的主要用途是什么?

我是否认为我可以将任何数量的对象与单个视图关联?


假设您生成一堆相似的视图。 您可以OnClickListener为每个视图设置一个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());
    }
};

这基本上是观点有回忆的一种方式。


我想补充几句话。

虽然使用get/setTag(Object)在ViewHolder模式的特殊情况下似乎非常有用,但我建议在使用它之前先考虑三次。 几乎总是有另一个好的设计解决方案。

主要原因是代码很快就变得不可支持。

  • 对于其他开发人员而言,您设计的视图标记是不明显的。 setTag / getTag方法根本不具有描述性。

  • 它只存储一个Object ,所以当你想getTag时它需要getTag 。 稍后当您决定更改标签中的存储对象类型时,您可能会意外崩溃。

  • 这是现实生活中的故事。 我们有一个非常大的项目,有很多适配器,有视图的异步操作等等。 一位开发人员决定在他的部分代码中set/getTag ,但另一位开发人员已经为此视图设置了标记。 最终有人找不到自己的标签,而且很困惑。 这花费了我们几个小时才能找到错误。

  • setTag(int key, Object tag)看起来好多了,因为你可以为每个标签(使用id资源)生成唯一的键值,但是Android <4.0有一个很大的限制。 从Lint文档:

    在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);
    
    链接地址: http://www.djcxy.com/p/91391.html

    上一篇: What is the main purpose of setTag() getTag() methods of View?

    下一篇: What exactly is a monkey doing messing with my Android phone?