Поведение слушателя при нажатии на Android - PullRequest
0 голосов
/ 07 мая 2018

Захват экрана Android

Это может быть глупый вопрос.

В Android, когда я меняю два TextViews, почему их onClickListeners тоже не меняются местами (в работе)?

Хэш-коды объекта поменялись местами, как и объект mListenerInfo. (Часть класса просмотра)

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    var textView1 = TextView(this)
    var textView2 = TextView(this)

    textView1.text = "T1"
    textView2.text = "T2"

    //linear is a LinearLayout via kotlinx access

    linear.addView(textView1)
    linear.addView(textView2)

    textView1.setOnClickListener({
        Toast.makeText(applicationContext, it.hashCode().toString(), Toast.LENGTH_SHORT).show()
    })

    textView2.setOnClickListener({
        Toast.makeText(applicationContext, it.hashCode().toString(), Toast.LENGTH_SHORT).show()
    })

    val x = textView1
    textView1 = textView2
    textView2 = x

    Toast.makeText(applicationContext, textView1.hashCode().toString() +"\n" + textView1.text, Toast.LENGTH_SHORT)
        .show()

    Toast.makeText(applicationContext, textView2.hashCode().toString() +"\n" + textView2.text, Toast
        .LENGTH_SHORT).show()

  }
}

TextViews и их соответствующие свойства меняются местами, поэтому textView1.text возвращает «T2», но при нажатии T1 на экране мы все равно получаем старый хэш-код.

Я что-то здесь не так делаю?

1 Ответ

0 голосов
/ 08 мая 2018

Поскольку ключевое слово "it" и все остальные переменные в лямбдах являются окончательными.

textView1.setOnClickListener {
    Toast.makeText(applicationContext, it.hashCode().toString(), Toast.LENGTH_SHORT).show()
}

Итак, ваш код it.hashCode() относится к конкретной функции неизменяемого объекта в вашей памяти. Даже если вы поменяете местами t1 с t2, вы вызовете правильный объект и даже надлежащего слушателя, но it все еще ссылается на старый объект.

После замены этих представлений вы должны исправить своих слушателей (например, создав новые).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...