reader
reader

Reputation: 37

Unresolved Reference using Kotlin for android

I am getting Unresolved Reference when compiling

Error:(42, 26) Unresolved reference: r1 Error:(42, 36) Unresolved reference: ds

in the onClick method variables r1, and ds are shown to be in errors. in kotlin all varibales are final. so how come it is not accepting it. please advice following is the script

class MainActivity : AppCompatActivity(), View.OnClickListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val b1: Button = findViewById(R.id.add)

        val a1: EditText = findViewById(R.id.opr1)
        val a2: EditText = findViewById(R.id.opr2)

        val d1: Int = (a1.getText().toString().toInt())
        val d2: Int = (a2.getText().toString().toInt())

      var r1: TextView = findViewById(R.id.res)
        var ds :Int =d1+d2


    }

    override fun onClick(v: View?) {

        when (v?.id) {

            R.id.add ->  r1.text= (ds).toString()

        }
    }
}

Upvotes: 0

Views: 3718

Answers (3)

CrazyApple
CrazyApple

Reputation: 482

ds is local variable that can only be accessed within the function onCreate(). If you want to sum up the numbers of the EditText, you should put your addition logic inside the onClick() method:

override fun onClick(v: View) {
    when (v.id) {
        R.id.add -> {
            val d1: Int = et1.text.toString().toInt()
            val d2: Int = et2.text.toString().toInt()
            val ds = d1 + d2
            r1.text = ds.toString()
        }
    }
}

Also, you should declare r1 and other view reference as class member so that they can be accessed within your Activity class but not only onCreate().

Upvotes: 1

Sergio
Sergio

Reputation: 864

The variable ds only exists into the first function. You must declare it outside to access it from the second.

Upvotes: 0

Eugen Pechanec
Eugen Pechanec

Reputation: 38243

r1 is a local variable in onCreate so it's not accessible outside of this function.

Declare it outside of the function like so:

private lateinit var r1: TextView

Assign it in onCreate like so:

r1 = findViewById(R.id.res)

Then you can access it as you expect:

r1.text= ds.toString()

The same rule applies for other variables you want to access outside of onCreate.

Why lateinit

onCreate is not a constructor so r1 is uninitialized before that. But you know that onCreate is the first thing called in the activity lifecycle so when you initialize the variable here it will always be non-null.

Otherwise you'd have to declare the variable like this:

private var r1: TextView?

and access it with the !! operator, for example:

r1!!.setText(...)

Upvotes: 0

Related Questions