微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决资源 ID 在 AGP 7.0 中将是非最终的

我有一个 annotation processing library 可以在编译时生成 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

以及 Generated R.layout 类。

public final class R {
    public static final class layout {
        public static final int sample = 567541283;
    }
}

处理 ViewHolder 注释时,处理器将收到 integer567541283

在第一个处理周期中,处理器会分析 R 类并创建一个表来将 integer 映射到布局名称,在本例中为 567541283 { {1}}。

根据这些信息,我可以遍历布局资源目录并找到名称sample 的布局文件。 我也可以稍后致电 sample.xml

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

注解参数必须是编译时常量。

可能的解决方

  1. (Butterknife solution) 创建一个重复的 R 类,它将生成 R.layout 变量作为 inflate(R.layout.sample),从而消除我的 static final 类依赖。

  2. (AndroidAnnotations solution)。使用字符串代替 R 类。我不太喜欢这个解决方案,因为如果布局重命名或打字错误,它会导致问题。

我不确定我对这两者的感觉有多开心,但老实说,我看不到其他解决方法

如果有人有更好的方法解决这个问题,我很想听听,如果没有,您更喜欢哪种解决方案?

谢谢

我正在链接我在 GitHub 项目中打开的 issue,以防您想贡献。

解决方法

另一种解决方案是向 GencyclerModel 添加一个方法,该方法返回布局引用并从注释中删除该引用。我想这种方法会产生的唯一问题是您检查编译器中是否存在布局文件的条件。但是使用这种方法,您不会在注释中硬编码布局引用,而是从每个模型内的方法中获取它们

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。