应用程序在此行崩溃 private val operationtexView: TextView = findViewById(R.id.operation)

问题描述 投票:0回答:1

当我在手机上启动应用程序时,它无法打开。问题出在这一行

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)

android kotlin
1个回答
0
投票

您可能会遇到

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 视图推荐的视图绑定方法。

© www.soinside.com 2019 - 2024. All rights reserved.