android - 为什么R类不包含字段类型?
问题描述
每当我们想要扩充视图或获取资源时,我们都必须在运行时进行投射。例如,视图的使用方式如下:
过去,我们需要在本地进行投射
(RelativeLayout) findViewById(R.id.my_relative_layout_view)
现在,我们使用泛型
findViewById<RelativeLayout>(R.id.my_relative_layout_view)
我的问题是为什么编译器(或生成 R 类的人)不保留对元素类型的某种引用(不管它是字符串还是 int 或任何其他类型)这样就不会出现铸造问题
解决方案
我们不能真正推测,那将是一个设计选择。
可能是他们想避免 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()
推荐阅读
- java - 为什么图像没有插入数据库
- mysql - 如何从 Mysql 中的不同表中连接 2 个计数?
- regex - 正则表达式将数据框字符串拆分为python中的列
- c++ - 我的 sim800l 仅在连接到打开串行监视器的笔记本电脑时工作
- c++ - 警告:编译器可以假设'x'的地址永远不会是NULL
- android - 为什么使用 wrap_content 时我的 DailogFragment 如此之大?
- javascript - 如何为数组中的特定数值返回真或假?
- json - Golang 如何将嵌套结构解组为一片结构
- spring - 从 Spring Beans 访问命令行参数(在本例中为 ApplicationReadyEvent 侦听器)
- matlab - MATLAB struct - 如果一开始就明确定义了一维,则为多维数据结构?