java - 使用 Kotlin 在 android 中声明 UI 组件的最佳方法是什么?

标签 java android kotlin

我第一次尝试使用 Kotlin 构建 android 应用程序。

我想在 OnCreate 方法之外的一些按钮上声明,我只能在这个函数内部使用 findViewById 初始化它们。

我可以像在 java 中那样用简单干净的代码声明吗?

private Button btnProceed;

因为在将其转换为 Kotlin 时,它看起来像:

private var btnProceed: Button? = null

然后在初始化OnClick函数的时候需要加上!签到:

btnProceed!!.setOnClickListener

什么是正确和最干净的方法?

最佳答案

这是 lateinit 的一个很好的用例.标记属性 lateinit 允许您使其不可为空,但不会在调用 Activity 的构造函数时为其分配值。当初始化发生在一个单独的初始化方法中,晚于正在运行的构造函数(在本例中为 onCreate)时,它恰好适用于像 Activity 这样的类。

private lateinit var btnProceed: Button

如果在为其分配实际值之前读取该属性,它将在运行时引发异常 - 通过使用 lateinit,您有责任在访问它之前对其进行初始化第一次。


否则,如果您希望编译器为您保证安全访问,您可以让 Button 像转换器默认的那样为空。而不是不安全的!! operator但是,转换器经常使用它,您应该使用 safe call operator您访问特性的位置:

btnProceed?.setOnClickListener { ... }

如果 btnProceed 是非空值,这将进行常规调用,否则不执行任何操作。


最后,您可以查看 Kotlin Android Extensions ,如果它适用于您的项目,则无需为您的 View 创建属性。


最后一次编辑(目前):您还应该看看如何使用 lazy,如 other 中所述answers .懒惰很酷。

关于java - 使用 Kotlin 在 android 中声明 UI 组件的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44285703/

相关文章:

java - Android 谷歌地图、折线和缩放

android - 当我们将它们添加到 fragment 和主要 Activity 中时,选项菜单的流程是怎样的?

json - 如何处理从API接收的数据类中的信息

java - 不幸的是 MyApp 已停止。我该如何解决这个问题?

java - java中如何调整数组大小?

java - 清理 HTML 字符串

java固定线程池和定时线程池的区别

android - 多个 AsyncHttpClient 获取填充一个 Activity 的请求

Android 将图像路径存储到 SQLite 数据库中

java - org.gradle.execution.MultipleBuildFailures 使用@Query Room Persistence Library 时