Home > Software design >  findViewById keeps giving me errors and a headache
findViewById keeps giving me errors and a headache

Time:04-18

Hello all,

I am new to Kotlin and was trying to keep recreating my code to get it easier for me to learn. i have created an dice app and it works. but everytime i create a new project and start. I always get the error on findViewById(R.id.) i make the layout first with all the ID`s assigned but no matter what i do i keep getting this error. I use Android Studio. I hope someone can help me get this frustration out of my head.I want to know why it keeps getting that error. thanks in advance.

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()
    }
}

CodePudding user response:

Ok, Sometimes I was also getting this error by defining findViewById in any function. So I used to solve it by defining it in the right place, you try this method of mine, maybe your problem will be solved. Just remove these below 2 findViewById from fun stones()

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

and add them with your first findViewById code as below I mentioned.

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

If your problem is the same, let me know with Logcat.

CodePudding user response:

The suggested approach is to migrate to view binding.
Plus, you should declare the stones() function inside the MainActivity class body:

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()
    }
}
  • Related