在Android中以编程方式获取视图名称

13

我正在做一个小型库来封装适配器功能,我需要以编程方式获取视图的名称。例如:

我正在做一个小型库,用于封装适配器功能,我需要通过编程方式获取视图的名称。例如:

<ImageView
        android:id="@+id/**ivPerson**"
        android:layout_width="80dp"
        android:layout_height="80dp"/>

现在,在代码中,我有一个视图(ImageView),我需要获取该视图的名称--> ivPerson。我可以使用view.getId()获取id,但那不是我所需的。

这可能吗?

我尝试了这个:

String name = context.getResources().getResourceEntryName(view.getId());

但不工作。


这样的名称到ID映射驻留在生成的R文件中。因此,可以通过反射实现这样的反向查找。 - Ahmed Khalaf
6个回答

14
您可以通过将标记设置为 id,即 android:tag="ivPerson",并使用String name = view.getTag().toString()来获取标记的名称。

但是当他需要该标签进行其他用途时,这将会引起问题。 - Ahmed Khalaf
这是一个好主意,也能正常工作。我会继续寻找其他方法,而不使用标签字段。谢谢! - Alejandro Martínez Martínez

14
您可以使用 getResourceName(...) 代替。
String fullName = getResources().getResourceName(view.getId());

但是有一个问题。这种方法将会给你一个完整的视图路径,例如:"com.google:id/ivPerson"

无论如何,你可以使用这个技巧来仅获取视图的名称:

String fullName = getResources().getResourceName(view.getId());
String name = fullName.substring(fullName.lastIndexOf("/") + 1);

现在name将会准确地是"ivPerson"


9

获取 View v 的名称方法如下:

String name = (v.getId() == View.NO_ID) ? "" :
    v.getResources().getResourceName(v.getId()).split(":id/")[1];

如果视图 v 没有名称,则name是一个空字符串""

3

无法使用getId()或其他方法获取ivPerson的id,但是您可以通过将标签值设置为rahul在答案中提到的方式来获取它。

在xml中设置标签:

android:tag="ivPerson"

在你的活动中获取它

view.getTag().toString();

2
你可以这样做:

    for(Field field : R.id.class.getFields()) {
        try {
            if(field.getInt(null) == R.id.helloTV) {
                Toast.makeText(this, field.getName(), Toast.LENGTH_LONG).show();
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

优点:

  • 无需手动设置标签,因此您可以将标签用于其他目的。

缺点:

  • 由于反射,速度较慢。

没问题,但我将其用于适配器中,可能会通过引入循环行为而恶化。这是个好主意。我会尝试两种方法。 - Alejandro Martínez Martínez

1

你可以使用:

String name = ((view != null) && (view.getId() != View.NO_ID)) ? getResources().getResourceEntryName(view.getId()) : "";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接