Я получаю неразрешенную ссылку при компиляции

Ошибка: (42, 26) Неразрешенная ссылка: r1 Ошибка: (42, 36) Неразрешенная ссылка: ds

В методе onClick переменные r1 и ds показаны с ошибками. в котлине все варибалы являются окончательными. так почему же он не принимает это? пожалуйста, совет следующий сценарий

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

        }
    }
}
0
reader 22 Окт 2017 в 14:45

3 ответа

Лучший ответ

ds является локальной переменной, доступ к которой возможен только внутри функции onCreate(). Если вы хотите суммировать числа EditText, вы должны поместить свою логику добавления в метод onClick():

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

Кроме того, вы должны объявить r1 и другую ссылку на представление в качестве члена класса, чтобы они могли быть доступны в вашем Activity классе, но не только onCreate().

1
CrazyApple 22 Окт 2017 в 12:07

r1 - локальная переменная в onCreate, поэтому она недоступна вне этой функции.

Объявите это вне функции следующим образом:

private lateinit var r1: TextView

Назначьте его в onCreate примерно так:

r1 = findViewById(R.id.res)

Тогда вы можете получить к нему доступ, как вы ожидаете:

r1.text= ds.toString()

Это же правило применяется к другим переменным, к которым вы хотите получить доступ за пределами onCreate.

Почему латинит

onCreate не является конструктором, поэтому r1 до этого не инициализирован. Но вы знаете, что onCreate - это первое, что вызывается в жизненном цикле действия, поэтому, когда вы инициализируете переменную здесь, она всегда будет ненулевой.

В противном случае вам придется объявить переменную следующим образом:

private var r1: TextView?

И получить к нему доступ с помощью оператора !!, например:

r1!!.setText(...)
0
Eugen Pechanec 22 Окт 2017 в 11:52

Переменная ds существует только в первой функции. Вы должны объявить это снаружи, чтобы получить доступ к нему со второго.

0
Sergio 22 Окт 2017 в 11:52