通过 getIdentifier 获取的资源 ID 返回 0。

3
private String isChecked(String id) {
    id = "R.id." + id;
    int ID = getResources().getIdentifier(id, "id", "com.example.android.justjava");
    CheckBox checkBox = (CheckBox) findViewById(ID);
    return String.valueOf(checkBox.isChecked());
}

我将一个值check_whipped_cream(xml文档中复选框的id)传递给上面的函数,但是当我调试应用程序时,变量ID总是等于0。有什么问题吗?

注意:最后一行方法中调用的isChecked()来自CheckBox类。

3个回答

4

最大的问题是

 id = "R.id." + id;

你正在请求Android在id中寻找R.id.id,因为你已经提供了"id"作为第二个参数。应该只是id。为了避免拼写错误的问题,你应该依赖于.getPackageName()的返回值,而不是自己硬编码它。
使用getPackageName()来代替id = "R.id." + id;
getResources().getIdentifier(id, "id", getPackageName());

id是一个字符串... 如果我插入"hello",它将变成"R.id."+"hello" - undefined
1
如果你声明了一个带有标识符"hello"的"id",那么你只需要提供"hello"。 - undefined
哦,我明白了...我们不需要R.id.这部分吗? - undefined
1
你不需要。第二个参数会处理它。 - undefined

2
理解什么是什么,让我们举个例子。
<TextView
        android:id="@+id/lbl_welcome"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/img_logo"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:text="YOUR SHOPPING COMPANION!"
        android:textColor="@color/toolbar"
        android:textSize="@dimen/font_12"/>

在上面的代码中,如果我想检索这个元素,那么我会使用

R.id.lbl_welcome 它的实际值在 R.java 文件中,类似于这样

public final class R {
    public static final class id {
        public static final int lbl_welcome=0x7f100197;
    }
}

如果您有视图的字符串名称,例如我们的lbl_welcome,那么我们可以使用getIdentifier方法-

getResources().getIdentifier("lbl_welcome", "id", getPackageName());

上面的代码将会给您一个等同于 R.id.lbl_welcome 的值。

2
首先,为了确保包名正确,您可以使用context.getPackageName()。
其次,您的id是错误的,不要将R.id与其连接起来,这是您的错误 ;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接