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)
在新版本中,该字段将是非最终字段,因此引发编译时错误
注释参数必须是编译时常量
可能的解决方案
static final
,从而删除我的R
类依赖关系
资源
类。我不太喜欢这个解决方案,因为它会导致问题,如果布局被重命名或打字错误
我正在链接我在GitHub项目中打开的,以防您愿意参与。另一个解决方案是向gencCyclerModel添加一个方法,该方法返回布局引用并从注释中删除该引用。我想这种方法唯一的问题是检查编译器中是否存在布局文件。但是使用这种方法,您不会在注释中硬编码布局引用,您会从每个模型中的方法中获取它们,这是行不通的,因为如果我将值放入模型中,它在编译时将不可用,我需要它在编译时可用,以便能够找到布局文件并在编译阶段解析所有视图,以便生成代码。