findViewById 一直给我错误和头痛

findViewById keeps giving me errors and a headache

大家好,

我是 Kotlin 的新手,我一直在努力重新创建我的代码以使其更容易学习。我创建了一个骰子应用程序并且可以正常工作。但每次我创建一个新项目并开始时。我总是在 findViewById(R.id.) 上收到错误消息,我首先使用分配的所有 ID 进行布局,但无论我做什么,我都会不断收到此错误消息。我使用 Android Studio。 我希望有人可以帮助我摆脱这种挫败感 head.I 想知道为什么它一直出现该错误。提前致谢。

package com.example.dicedicebaby

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView

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

        //button action`
        val rollButton: Button = findViewById(R.id.button)
        
        //action of the button when pressed.
        rollButton.setOnClickListener{ stones()} 
    }
}

fun stones(){
    //The normal dice
    val fDice=Dice(6)
    //D20
    val dDice = Dice(20)
    //action of dice roll
   val dice = fDice.roll()
    //D20 action
    val secondDice = dDice.roll()
    //view
    val resultView: TextView = findViewById(R.id.dice)
    resultView.text = dice.toString()

    val secondView: TextView = findViewById(R.id.Ddice)
    secondView.text = secondDice.toString()
    


}

//makes the dice a dice.
class Dice(private val numSides:Int){

    fun roll():Int{
        return (1..numSides).random()
    }
}

好的,有时我在任何函数中定义 findViewById 也会遇到此错误。所以我以前是通过在合适的地方定义来解决的,你试试我的这个方法,说不定你的问题就解决了。只需从 fun stones()

中删除以下 2 个 findViewById
val resultView: TextView = findViewById(R.id.dice)
val secondView: TextView = findViewById(R.id.Ddice)

并按照我提到的第一个 findViewById 代码添加它们。

val rollButton: Button = findViewById(R.id.button)
val resultView: TextView = findViewById(R.id.dice)
val secondView: TextView = findViewById(R.id.Ddice)

如果您遇到同样的问题,请使用Logcat告诉我。

建议的方法是迁移到 view binding
另外,您应该在 MainActivity class 正文中声明 stones() 函数:

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        //action of the button when pressed.
        binding.rollButton.setOnClickListener{ stones() } 
    }

    fun stones(){
        //The normal dice
        val fDice=Dice(6)
        //D20
        val dDice = Dice(20)
        //action of dice roll
        val dice = fDice.roll()
        //D20 action
        val secondDice = dDice.roll()
        //view
        binding.dice.text = dice.toString()
        binding.Ddice.text = secondDice.toString()
    }
}