当我在手机上启动应用程序时,它无法打开。问题出在这一行
private val operationtexView: TextView = findViewById(R.id.operation)
package com.daniff.calculator
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import kotlin.text.StringBuilder
class MainActivity : AppCompatActivity() {
private var numOne = ""
private var numTwo = ""
private var operation = ""
private val operationtexView: TextView = findViewById(R.id.operation)
private val buttn0: TextView = findViewById(R.id.buttn0)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initListener()
}
private fun initListener(){
buttn0.setOnClickListener { AddNumberInput( 0.toString() ) }
}
private fun AddNumberInput(number: String){
if(operation == ""){
numOne += number
} else{
numTwo += number
}
operationtexView.text = StringBuilder().append(operationtexView.text.toString()).append(number)
}
我一直在对整个代码进行评论,但它在这一行失败了
private val operationtexView: TextView = findViewById(R.id.operation)
您可能会遇到
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference
。
发生这种情况是因为方法
findViewById(R.id.operation)
在 Java 运行时实例化 MainActivity
实例时被调用,但在调用 Android activity 生命周期的
onCreate()
方法之前,您在其中调用setContentView()
,这是 findViewById()
正常运行所必需的。
但是,您可以使用 Kotlin
lazy委托推迟
findViewById
调用,这会延迟此操作,直到首次访问该属性,如下所示:
private val operationtexView: TextView by lazy(LazyThreadSafetyMode.NONE) {
findViewById(R.id.operation)
}
我使用了
LazyThreadSafetyMode.NONE
,因为我们在这里不需要同步,因为视图只能从主线程访问。
此外,您可能需要考虑使用 Google 针对传统 Android 视图推荐的视图绑定方法。