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

2022-09-02 20:17:03

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

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

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

private Button btnProceed;

因为当它转换为 Kotlin 时,它看起来像这样:

private var btnProceed: Button? = null

然后在初始化OnClick函数时需要添加!标志:

btnProceed!!.setOnClickListener

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


答案 1

这是 lateinit 的一个很好的用例。通过标记属性,可以将其设置为非空,但不能在调用 Activity 的构造函数时为其分配值。它正好适用于像 Activities 这样的类,当初始化发生在单独的初始值设定项方法中时,它比正在运行的构造函数晚(在本例中为 )。lateinitonCreate

private lateinit var btnProceed: Button

如果在将属性赋给实际值之前读取该属性,它将在运行时引发异常 - 通过使用 ,您将在首次访问它之前负责初始化它。lateinit


否则,如果希望编译器保证您的安全访问,则可以像转换器默认执行的那样使 nullable。但是,您应该使用安全呼叫运算符来访问属性,而不是转换器经常使用的不安全的!! 运算符Button

btnProceed?.setOnClickListener { ... }

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


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


上次编辑(现在):您还应该按照其他答案中的描述进行使用。懒惰很酷。lazy


答案 2

除了使用 之外,您还可以执行惰性初始化lateinit

private val button by lazy {
    findViewById(R.id.button) as Button
}

首次访问该属性时,它将执行该块一次,并将结果用于将来的调用。例如,您现在可以直接访问它:buttononCreate

fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(bundle)
  setContentView(R.layout.my_view)

  button.setOnClickListener { ... }
}

推荐