首页 > 解决方案 > 为什么R类不包含字段类型?

问题描述

每当我们想要扩充视图或获取资源时,我们都必须在运行时进行投射。例如,视图的使用方式如下:

过去,我们需要在本地进行投射

(RelativeLayout) findViewById(R.id.my_relative_layout_view)

现在,我们使用泛型

findViewById<RelativeLayout>(R.id.my_relative_layout_view)

我的问题是为什么编译器(或生成 R 类的人)不保留对元素类型的某种引用(不管它是字符串还是 int 或任何其他类型)这样就不会出现铸造问题

标签: androidandroid-gradle-plugin

解决方案


我们不能真正推测,那将是一个设计选择。

可能是他们想避免 APK 臃肿。每个 ID 都需要类的完整包名。android.R 中的每个 ID 也是如此。由于 R 被打包在每个 APK 中。

解决方案

但是,如果您使用的是 Kotlin,您甚至可以取消泛型检查。Kotlin 会自动确定它。

val view = findViewById(R.id.my_relative_layout_view)
view.method()

或者事件更简单,如果您使用合成:

my_relative_layout_view.method()

此外,如果您正在使用数据绑定,您可以像这样访问它:

binding.my_relative_layout_view.method()

推荐阅读