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

Get view name programmatically in Android

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

<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 来实现,即 android:tag="ivPerson" 并使用 String name = view.getTag().toString() 获取标签的名称

无法使用 getId() 或任何其他方法获取 ivPerson id,但是您可以通过设置标签值来获取它,如 rahul 的

在 xml 中设置标签:

android:tag="ivPerson"

在您的 activity

中获取它
view.getTag().toString();

你可以这样做:

    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();
        }
    }

优点:

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

缺点:

  • 由于反射较慢。

您可以改用 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"

View v取其名如下:

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

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

您可以使用:

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