定义全局android.widget var/val时,"lateinit"或"by lazy"

Dan*_*orm 8 android-widget kotlin android-studio

在定义全局android.widget变量时,例如TextView,是否优先使用lateinitby lazy?我最初认为使用by lazy将是首选,因为它不可变但我不完全确定.

by lazy 例:

class MainActivity: AppCompatActivity() {

    val helloWorldTextView by lazy { findViewById(R.id.helloWorldTextView) as TextView }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        updateTextView(helloWorldTextView)
    }

    fun updateTextView(tv: TextView?) {
        tv?.setText("Hello?")
    }
}
Run Code Online (Sandbox Code Playgroud)

lateinit 例:

class MainActivity: AppCompatActivity() {

    lateinit var helloWorldTextView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        helloWorldTextView = findViewById(R.id.helloWorldTextView) as TextView
        updateTextView(helloWorldTextView)
    }

    fun updateTextView(tv: TextView?) {
        tv?.setText("Hello?")
    }
}
Run Code Online (Sandbox Code Playgroud)

在定义全局android.widgetvar/val 时,使用一个优于另一个有什么好处吗?使用by lazy定义android.widgetval 有任何陷阱吗?决定是基于您是否需要可变值或不可变值?

tyn*_*ynn 10

有一个陷阱by lazy.widget属性是只读的,因此在技术上是最终的(用Java术语).但是没有文档保证onCreate()仅对实例调用一次.也findViewById()可以回来null.

所以使用lateinit是优选的,你会得到一个例外,告诉你val之前是否使用过onCreate().

第三种可能性是Android合成属性.那么你根本不需要担心变量.

import kotlinx.android.synthetic.main.activity_main.*

helloWorldTextView.text = "Hello?"
Run Code Online (Sandbox Code Playgroud)