Android - 类型ID的预期资源

The*_*bie 44 java android esri arcgis

我有这个代码

final static int TITLE_ID = 1;
final static int REVIEW_ID = 2;
Run Code Online (Sandbox Code Playgroud)

现在,我想在我的主类中创建一个新的布局

public View createContent() {
    // create linear layout for the entire view
    LinearLayout layout = new LinearLayout(this);
    layout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT));
    layout.setOrientation(LinearLayout.VERTICAL);

    // create TextView for the title
    TextView titleView = new TextView(this);
    titleView.setId(TITLE_ID);
    titleView.setTextColor(Color.GRAY);
    layout.addView(titleView);

    StarView sv = new StarView(this);
    sv.setId(REVIEW_ID);
    layout.addView(sv);

    return layout;
}
Run Code Online (Sandbox Code Playgroud)

但是当我调用TITLE_ID和REVIEW_ID时,它会给我一个错误

提供错误类型的资源标识符.
例如,在调用Resources.getString(int id)时,您应该传递R.string.something,而不是R.drawable.something.
将错误的常量传递给期望一组特定常量的方法.例如,在调用View#setLayoutDirection时,参数必须是android.view.View.LAYOUT_DIRECTION_LTR或android.view.View.LAYOUT_DIRECTION_RTL.

运行此代码时没有任何问题.我只是想知道它为什么会给我一个错误.任何的想法?

Gir*_*hai 102

这不是编译器错误.这只是编辑器验证错误(lint警告),因为这不是处理ID的常用方法.

因此,如果您的应用支持API 17及更高版本,

你可以调用View.generateViewId作为

  titleView.setId(View.generateViewId());
Run Code Online (Sandbox Code Playgroud)

  sv.setId(View.generateViewId());
Run Code Online (Sandbox Code Playgroud)

并且API <17

  1. 打开项目的res/values/文件夹
  2. 创建一个名为的xml文件 ids.xml

具有以下内容:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="titleId" type="id" />
    <item name="svId" type="id" />
</resources>
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中,

  titleView.setId(R.id.titleId);
Run Code Online (Sandbox Code Playgroud)

  sv.setId(R.id.svId);
Run Code Online (Sandbox Code Playgroud)

并禁用此警告(如果需要)

在Android Studio中单击灯泡上的此"错误".然后在第一个子菜单中选择" 禁用检查".

  • 使用generateViewId时:如果我想稍后引用特定视图怎么办?我怎么知道身份证?让我们说50个生成视图中的第10个? (5认同)

Alv*_*lvi 25

您还可以在build.gradle文件中禁用lint.在build.gradle文件中添加这些行.

android { 
       lintOptions{
             disable "ResourceType"
       }
}
Run Code Online (Sandbox Code Playgroud)


Aba*_*art 6

我将此作为替代"修复"那些无法生成视图ID的问题(即在视图实际存在之前定义ID)以及知道他们在做什么.

在包含该问题的变量声明或方法的正上方,只需包括@SuppressWarnings("ISSUE_IDENTIFIER")禁用该实例的lint警告.

在这种情况下,它会 @SuppressWarnings("ResourceType")

使用常规方法禁用警告类型是不好的做法,可能导致无法预料的问题,例如内存泄漏和代码不稳定.不要发布垃圾.

确保撤消选项Disable inspection并从build.gradle中删除这些行:

android {
    lintOptions{
        disable "ResourceType"
    }
}
Run Code Online (Sandbox Code Playgroud)