使用 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,如果它适用于您的项目,则无需为您的View
s 创建属性。
最后一次编辑(目前):您还应该考虑使用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?