Android Click Listener Behavior

时间:2018-05-07 19:02:10

标签: java android android-layout kotlin

Screen Grab Android

这可能是一个愚蠢的问题。

在Android中,当我交换两个TextView时,为什么他们的onClickListeners也不会被交换(在工作中)?

虽然交换了对象哈希码,但mListenerInfo对象也是如此。 (View Class的一部分)

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 :(得分:1)

因为关键字“it”和lambda中的所有其他变量都是最终的。

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

因此,您的代码it.hashCode()引用了内存中不可变对象的特定功能。 即使你用t2交换t1,你也会调用适当的对象,甚至是适当的监听器,但it仍然引用旧对象。

交换这些视图后,您应该修复您的监听器(例如,通过创建新的监听器)。