这可能是一个愚蠢的问题。
在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时,我们仍然会得到旧的哈希码。
我在这里做错了吗?
答案 0 :(得分:1)
因为关键字“it”和lambda中的所有其他变量都是最终的。
textView1.setOnClickListener {
Toast.makeText(applicationContext, it.hashCode().toString(), Toast.LENGTH_SHORT).show()
}
因此,您的代码it.hashCode()
引用了内存中不可变对象的特定功能。
即使你用t2交换t1,你也会调用适当的对象,甚至是适当的监听器,但it
仍然引用旧对象。
交换这些视图后,您应该修复您的监听器(例如,通过创建新的监听器)。