定义全局android.widget var / val

时间:2017-05-18 20:12:07

标签: android-studio android-widget kotlin

定义全局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?")
    }
}

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?")
    }
}

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

1 个答案:

答案 0 :(得分:10)

by lazy存在一个陷阱。 widget属性是只读的,因此技术上 final(用Java术语)。但是没有文件证明onCreate()仅为一个实例调用一次。 findViewById()也可以返回null

因此,最好使用lateinit,并且在val之前您是否会使用onCreate()时会收到例外情况。

第三种可能性是Android synthetic properties。那么你根本不需要担心变量。

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

helloWorldTextView.text = "Hello?"