android 通过Id(int)获取视图Id(string)的更简单方法

z6psavjg  于 2022-12-25  发布在  Android
关注(0)|答案(9)|浏览(183)

我有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”)时,总是得到“false”。
最后,我找到了一个解决方案,代码如下:

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

有没有更简单的办法弄到这个身份证?

aurhwmvo

aurhwmvo1#

像这样:

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

我在视图构造函数中使用它来生成更有意义的TAG

3yhwsihp

3yhwsihp2#

这种方法一开始就被误导了。如果你想把一个任意的数据(比如字符串)和一个视图关联起来,那就是tag的作用。ID是数字的,最好保持这种状态。不过要注意的是,在Android中标签不是唯一的,注意同一个视图树中的标签冲突。
稍后编辑:OP的问题是一个XY problem的例子。也就是说,问题标题 * 单独 * 本身就是一个合法的问题。

brqmpdu1

brqmpdu13#

编辑:
你必须使用
第一个月
如果要检索与resId关联的条目名称

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

int id = this.getResources().getIdentifier("yourtext", "string", this.getPackageName());
pkmbmrz7

pkmbmrz74#

您可以检查每个按钮的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;
    }
}
6g8kf2rb

6g8kf2rb5#

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 ;电视

qxsslcnc

qxsslcnc6#

您可以将此toString()放入Android View中,它将返回字符串资源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;
}
hfyxw5xn

hfyxw5xn7#

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

val View.stringId: String
    get() {
        return if (this.id == -0x1)
            "no-id"
        else
            this.resources.getResourceName(this.id)
    }
cygmwpex

cygmwpex8#

这是一个迟来的答案,但可能会有用的人寻找一种方法来获得任何视图/ drawable / String编程的资源id(int)。
图像来自resd/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());
kadbb459

kadbb4599#

@群众之王的回答很棒,以下是我在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)

相关问题