我是android和java的新手,很抱歉,如果这是一个非常基本的问题,但我试图在论坛和谷歌找到解决方案,我不能。
我的布局中有24个按钮,所有这些按钮都做类似的事情所以我想创建一个通用的功能。但首先我需要知道他按钮的名称(xml id)。
这是按钮的XML代码:
<Button
android:id="@+id/add_04"
android:layout_width="42dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="15dp"
android:background="@xml/zbuttonshape"
android:onClick="onClick"
android:text="@string/mas" />
我为所有按钮设置了android:onClick =“onClick”。
在我的活动中,我在onClick上创建了一个新函数:
这是我尝试过的代码:
public void onClick(View v) {
String name = v.getContext().getString(v.getId());
String name2 = context.getString(v.getId());
String name3 = getString(v.getId());
String name4 = getResources().getString(v.getId());
}
但是当我尝试获取名称(在本例中为“add_04”)时,我总是得到“假”。
最后,我找到了一个包含以下代码的解决方案:
import java.lang.reflect.Field;
String name5 = null;
Field[] campos = R.id.class.getFields();
for(Field f:campos){
try{
if(v.getId()==f.getInt(null)){
name5 = f.getName();
break;
}
}
catch(Exception e){
e.printStackTrace();
}
}
我的问题是,是否有更简单的方法来获取此ID?
提前致谢。
答案 0 :(得分:118)
/**
* @return "[package]:id/[xml-id]"
* where [package] is your package and [xml-id] is id of view
* or "no-id" if there is no id
*/
public static String getId(View view) {
if (view.getId() == 0xffffffff) return "no-id";
else return view.getResources().getResourceName(view.getId());
}
我在视图构造函数中使用它来制作更有意义的TAG
答案 1 :(得分:27)
这种做法一开始就是错误的。如果要将一段任意数据(例如字符串)与视图相关联,那就是tag
的用途。 ID是数字,最好保持这种状态。
答案 2 :(得分:21)
编辑:
你必须使用
getResources().getResourceEntryName(int resid);
如果要检索与resId
关联的条目名称或
您可以使用getIdentifier()
检索给定资源名称的资源标识符。
例如:
int id = this.getResources().getIdentifier("yourtext", "string", this.getPackageName());
答案 3 :(得分:17)
您可以这样检查每个按钮的ID:
public void onClick(View v) {
switch (v.getId()) {
case R.id.add_04:
Toast.makeText(MainActivity.this, "1", Toast.LENGTH_LONG).show();
break;
case R.id.add_05:
Toast.makeText(MainActivity.this, "2", Toast.LENGTH_LONG).show();
break;
}
}
答案 4 :(得分:5)
您可以将此toString()放在Android视图中,它将返回String资源ID。
@Override
public String toString() {
Context context;
Resources r = null;
context = getContext();
if (context != null) {
r = context.getResources();
}
String entryName = null;
if (r != null)
entryName = r.getResourceEntryName(getId());
return entryName;
}
答案 5 :(得分:4)
Use this Approach to get View Id by Programming .
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
/>
String id=getResources().getResourceEntryName(textView.getId());
Toast.makeText(this,id,Toast.LENGTH_LONG).show();
您将得到Result;电视
答案 6 :(得分:1)
Kotlin版本(来自@gadget)作为视图扩展名:
val View.stringId: String
get() {
return if (this.id == -0x1)
"no-id"
else
this.resources.getResourceName(this.id)
}
答案 7 :(得分:0)
这是一个较晚的答案,但对于寻找一种方法来获取任何视图/可绘制/字符串编程性资源ID(int)的人来说可能有用。
res / drawable中的图像
int resID = getResources().getIdentifier("my_image",
"drawable", getPackageName());
基于资源名称的视图
int resID = getResources().getIdentifier("my_resource",
"id", getPackageName());
字符串
int resID = getResources().getIdentifier("my_string",
"string", getPackageName());