通过Id(int)更轻松地获取视图的Id(字符串)

Ric*_*hal 51 android

我是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" />
Run Code Online (Sandbox Code Playgroud)

我为所有按钮设置了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()); 
}
Run Code Online (Sandbox Code Playgroud)

但是当我试图获得名称(在这种情况下是"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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否有更简单的方法来获取此ID?

提前致谢.

gad*_*get 124

像这样:

/**
 * @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());
}
Run Code Online (Sandbox Code Playgroud)

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

  • 来到这里寻找调试的方法,这个答案交付 (11认同)
  • `0xffffffff` 有一个常量叫做 `View.NO_ID` (https://developer.android.com/reference/android/view/View.html#NO_ID) (2认同)

Sev*_*yev 31

这种方法一开始就是错误的.如果你想将一段任意数据(例如一个字符串)与一个视图相关联,那tag就是为了什么.ID是数字,最好保持这种方式.

  • view.getResources().getResourceName(view.getId()); 返回给定资源标识符的全名。此名称是形式为 package:type/id" 的单个字符串。 (4认同)

Bla*_*elt 23

编辑:

你必须使用

getResources().getResourceEntryName(int resid);

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

要么

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

例如:

int id = this.getResources().getIdentifier("yourtext", "string", this.getPackageName());
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案,为什么?如果我的应用程序中有50个按钮,那么我必须为每个按钮设置标签,这不是最好的方法.但是,我可以使用`getResources().getResourceEntryName(int resid);`轻松获取视图条目ID.+1用于提供此解决方案 (4认同)

dil*_*lix 18

您可以这样检查每个按钮的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;
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 8

   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();
Run Code Online (Sandbox Code Playgroud)

你会得到结果;电视


tau*_*siq 6

您可以将此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;
}
Run Code Online (Sandbox Code Playgroud)