使用 Kotlin 在 android 中声明 UI 组件的最佳方法是啥?

Posted

技术标签:

【中文标题】使用 Kotlin 在 android 中声明 UI 组件的最佳方法是啥?【英文标题】:What is the best way to declare on UI component in android with Kotlin?使用 Kotlin 在 android 中声明 UI 组件的最佳方法是什么? 【发布时间】:2017-05-31 13:07:52 【问题描述】:

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

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

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

private Button btnProceed;

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

private var btnProceed: Button? = null

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

btnProceed!!.setOnClickListener

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

【问题讨论】:

"lateinit" or "by lazy" when defining global android.widget var/val的可能重复 嗨丹尼尔,我的问题更基本。你是对的,你的参考资料中的答案回答了我的问题,但如果有人不熟悉 lateinit 或懒惰(像我一样)不会像我一样找到这个问题。 【参考方案1】:

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

private lateinit var btnProceed: Button

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


否则,如果您希望编译器为您保证安全访问,您可以将Button 设为可空,就像转换器默认设置的那样。尽管转换器经常使用不安全的!! operator,但您应该在访问属性的地方使用safe call operator:

btnProceed?.setOnClickListener  ... 

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


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


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

【讨论】:

【参考方案2】:

除了lateinit,你也可以使用lazy initialization:

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

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

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

  button.setOnClickListener  ... 

【讨论】:

这可能会导致 Fragments 中的内存泄漏。 bignerdranch.com/blog/kotlin-when-to-use-lazy-or-lateinit 我尝试使用apply 在惰性块findViewById(R.id.button).applythis.setOnClickListener... 中设置OnClickListener。但它不起作用......但在 onCreate 内部起作用。你知道为什么吗?【参考方案3】:

您可以使用lateinit 来完成此操作,正如@zsmb13 建议的那样,但这样做的缺点是您的视图将是可变的而不是最终的。如果您希望它们成为最终版本,您可以使用lazy property delegation

通过使用lazy,您可以声明当您第一次尝试访问该值时将如何初始化它,因此通过声明

private val btnProceed: Button by lazy 
    findViewById(R.id.yourID)

每当您访问btnProceed 时,您都会加载您的活动(此示例假设您正在使用活动),以便您可以使用该方法

【讨论】:

以上是关于使用 Kotlin 在 android 中声明 UI 组件的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Kotlin 类中声明一个公共值 (val) 以便稍后对其进行初始化。在这种特殊情况下不能使用 var

如何使用 Android Kotlin 在 WebView 中加载 URL?

android studio怎么写kotlin

《Android》Chap.2 入门Kotlin

如何在 Kotlin 中创建一个打开新活动(Android Studio)的按钮?

用 Kotlin 写 Android 3—数组,集合与字符串