针对包含多个代码的视图的Android findViewWithTag

时间:2016-04-22 14:40:36

标签: android

我曾经使用view.setTag(t1);将标记设置为视图,然后使用正确返回的parent.findViewWithTag(t1);获取视图。

我现在需要为我的视图设置2个不同的标签,我正在使用

view.setTag(R.id.tag1, t1);
view.setTag(R.id.tag2, t2);

其中tag1和tag2是在res / values / ids.xml

中声明的id

然后我尝试使用标记t1获取视图,但parent.findViewWithTag(t1);返回null。我搜索过,没有方法findViewWithTag或类似的方法也接受标签的密钥。

有没有办法实现这个目标?如果没有,你可以指出我在android文档中说明的位置吗?

在这种特定情况下,我可以使用id而不是其中一个标签,但对于无法实现的情况,我想知道是否可以使用标签实现。

3 个答案:

答案 0 :(得分:3)

findViewWithTag(tag)返回使用setTag(tag)设置的tag.equals(getTag())设置的默认标记的视图。

答案 1 :(得分:1)

作为Diegos答案的补充,我想在源代码中指出它:

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/view/View.java#18288

if (tag != null && tag.equals(mTag)) {

用于比较和查找视图的标记是使用直接方法mTag设置的setTag(Object),如此行上的源代码所示:

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/view/View.java#18505

public void setTag(final Object tag) {
    mTag = tag;
}

答案 2 :(得分:1)

方法View.getTag()View.findViewWithTag()只会将Object分配的View.setTag()返回到某个View,另请参阅documentation

但是,您可以编写自己的findViewWithTag()方法:

public View findViewWithTag(@NonNull View parent, int tagID, @NonNull Object myTag) 
{
    for (int i = 0; i < parent.getChildCount(); i++)
    {
        View v = parent.getChildAt(i);
        if ( myTag.equals(v.getTag(tagID)) )
        {
            return v;
        }
    }
    return null;
}

您还可以通过在View子句中添加(v instanceof MySpecificView)等条件,将搜索范围缩小到if的特定子类。