在 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()) : "";
我正在做一个小型库来封装适配器功能,我需要以编程方式获取视图的名称。例如:
<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()) : "";