66

我是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?

提前致谢。

4

9 回答 9

154

像这样:

/**
 * @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() == View.NO_ID) return "no-id";
    else return view.getResources().getResourceName(view.getId());
}

我在视图构造函数中使用它来制作更有意义的标签

于 2013-08-05T20:58:26.963 回答
43

这种方法一开始就被误导了。如果你想将一段任意数据(例如一个字符串)与一个视图相关联,这就是tag目的。ID 是数字的,最好保持这种状态。不过需要注意的是,标签在 Android 中并不是唯一的,请注意同一视图树中的意外标签冲突。

稍后编辑:OP 的问题是XY 问题。也就是说,仅问题标题本身就是一个合法的问题。

于 2013-02-01T14:08:28.077 回答
28

编辑:

你必须使用

getResources().getResourceEntryName(int resid);

如果要检索与 resId 关联的条目名称

或者

您可以使用getIdentifier() 来检索给定资源名称的资源标识符。

例如:

int id = this.getResources().getIdentifier("yourtext", "string", this.getPackageName());
于 2013-02-01T14:01:05.263 回答
19

您可以通过以下方式检查每个按钮的 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;
    }
}
于 2013-02-01T14:02:32.770 回答
9
   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 ; 电视

于 2018-07-16T07:05:15.400 回答
7

您可以将此 toString() 放在 Android 视图中,它将返回字符串资源 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;
}
于 2014-05-13T10:05:24.130 回答
2

Kotlin 版本(来自@gadget)作为视图扩展:

val View.stringId: String
    get() {
        return if (this.id == -0x1)
            "no-id"
        else
            this.resources.getResourceName(this.id)
    }
于 2017-12-17T15:20:53.390 回答
2

这是一个较晚的答案,但可能对寻找一种方法来获取任何视图/可绘制/字符串编程的资源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()); 
于 2019-07-19T06:18:43.213 回答
0

@King of Masses 的回答很棒。这是我在 Kotlin 中的:

来自 res/drawable 的图像

val viewId = context.resources.getIdentifier("my_image", "drawable", context.packageName)

根据资源名称查看

val viewId = context.resources.getIdentifier("my_textview_id", "id", context.packageName)

细绳

val viewId = context.resources.getIdentifier("my_string", "string", context.packageName)

布局

val viewId = context.resources.getIdentifier("my_custom_layout", "layout", context.packageName)
于 2022-01-27T10:26:47.297 回答