Android 在AGP 7.0中,资源ID将是非最终的

Android 在AGP 7.0中,资源ID将是非最终的,android,android-gradle-plugin,open-source,annotation-processing,Android,Android Gradle Plugin,Open Source,Annotation Processing,我有一个在编译时生成RecyclerView适配器的程序 我目前正在重新构建它,并进行了许多更改和改进,但在测试过程中,我收到一条警告,指出: 资源ID在Android Gradle插件7.0版中不是最终版本, 避免将它们用作注释属性 这是一个问题,因为这意味着我不能在注释中使用R.layout变量 我目前使用它将布局文件的整数值与R类变量名相关联;这是为了从资源文件夹中找到布局文件,然后调用inflate(layoutResId) 目前,我是这样解决这个问题的 例子 给出了一个简单的ViewH

我有一个在编译时生成
RecyclerView
适配器的程序

我目前正在重新构建它,并进行了许多更改和改进,但在测试过程中,我收到一条警告,指出:

资源ID在Android Gradle插件7.0版中不是最终版本, 避免将它们用作注释属性

这是一个问题,因为这意味着我不能在注释中使用R.layout变量

我目前使用它将布局文件的整数值与R类变量名相关联;这是为了从资源文件夹中找到布局文件,然后调用inflate(layoutResId)

目前,我是这样解决这个问题的

例子 给出了一个简单的
ViewHolder
注释

annotation class ViewHolder(val layoutResId: Int)
使用

@ViewHolder(R.layout.sample)
data class Sample(val text: String) : GencyclerModel
以及生成的
R.layout

public final class R {
    public static final class layout {
        public static final int sample = 567541283;
    }
}
处理
ViewHolder
注释时,处理器将接收
整数
567541283

在第一个处理周期中,处理器将分析
R
类,并创建一个表,将
整数
映射到布局名称,在本例中为
567541283
示例

有了这些信息,我可以遍历布局资源目录,找到名为
sample.xml
的布局文件。 我以后也可以调用
inflate(R.layout.sample)

在新版本中,该字段将是非最终字段,因此引发编译时错误

注释参数必须是编译时常量

可能的解决方案
  • ()创建一个重复的R类,该类将生成R.layout变量作为
    static final
    ,从而删除我的
    R
    类依赖关系

  • ()。使用字符串而不是
    资源
    类。我不太喜欢这个解决方案,因为它会导致问题,如果布局被重命名或打字错误

  • 我不确定我对这两件事有多高兴,但老实说,我看不到其他解决办法

    如果有人有更好的方法来解决这个问题,我很想听听,如果没有,你会选择哪种解决方案

    谢谢


    我正在链接我在GitHub项目中打开的,以防您愿意参与。

    另一个解决方案是向gencCyclerModel添加一个方法,该方法返回布局引用并从注释中删除该引用。我想这种方法唯一的问题是检查编译器中是否存在布局文件。但是使用这种方法,您不会在注释中硬编码布局引用,您会从每个模型中的方法中获取它们,这是行不通的,因为如果我将值放入模型中,它在编译时将不可用,我需要它在编译时可用,以便能够找到布局文件并在编译阶段解析所有视图,以便生成代码。