为什么R类不包含字段类型?

时间:2018-10-31 15:51:15

标签: android android-gradle

每当我们想要扩大视图或获取资源时,我们都必须在运行时对其进行转换。例如,视图的用法如下:

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

(RelativeLayout) findViewById(R.id.my_relative_layout_view)

现在,我们使用泛型

findViewById<RelativeLayout>(R.id.my_relative_layout_view)

我的问题是,为什么编译器(或生成R类的人)不同时保留对元素类型的某种引用(无论是字符串,int还是其他类型,都没有关系)其他类型),这样就不会发生铸造问题

1 个答案:

答案 0 :(得分:1)

我们无法真正推测出那是一种设计选择。

可能是因为他们希望避免使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()