定义全局android.widget
变量时,例如TextView
,是否最好使用lateinit
或by 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是否有任何陷阱?决定是基于您是否需要可变或不可变的值?
答案 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?"