今天,我遇到了这个非常有趣的情况。
假设:
一个EditText
是从实例化XML
。
EditText editText; editText = findViewByID(R.id.editText_xml_id);
现在,我想听听重点的变化EditText
。所以我写了下面的代码:
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { Log.e("TAG", "Focus Changed in parent" ); } });
到此时为止一切都很好,因为当焦点改变时,将触发对数。
现在有趣的部分:说,我想放置相同的焦点侦听器,但是要两次!所以我要做的是:
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { Log.e("TAG", "Focus Changed in parent: First callback" ); } }); editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { Log.e("TAG", "Focus Changed in parent: Second callback" ); } });
我所期望的是,因为editText实例已设置为侦听两个实例,View.OnFocusChangeListeners
所以我认为结果将同时到达两个侦听器中。但是直到后来我才意识到只有后一个监听器(最晚设置)才在onFocuChange()中发送了实际的回调。这意味着,当焦点改变时,我期望的是:
Log.e("TAG", "Focus Changed in parent: First callback" ); Log.e("TAG", "Focus Changed in parent: Second callback" );
但是我得到的是:
Log.e("TAG", "Focus Changed in parent: Second callback" );
稍加思考,我认为这是因为在editText中设置的第一个侦听器被后者替换了。因此,只有一个TAG被击中。(如果我错了,请纠正我)
关于进一步的实验,我想如果我分配editText
给另一个EditText
变量然后为每个变量设置两个唯一的侦听器,该怎么办?
所以我这样做了:
EditText childEditText1; childEditText1 = editText;
然后,我分配了两个不同的侦听器:
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { Log.e("TAG", "Focus Changed in child" ); } }); childEditText1.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { Log.e("TAG", "Focus Changed in parent" ); } });
关于更改焦点,我期望两个标签都将被击中。这是因为现在有两个相同变量的DIFFERENT实例,并且每个实例都侦听两个DIFFERENT侦听器。但同样,只有一个被击中。期望:
//Expected Log.e("TAG", "Focus Changed in child" ); Log.e("TAG", "Focus Changed in parent" );
现实:
//Reality Log.e("TAG", "Focus Changed in parent" );
我想的是无论如何,两个EditText
实例都指向相同的内存空间?还是什么 因为否则两个TAGS都将被击中。
现在,如果有一些String并且其值被更改,这将是预期的。喜欢:
String str = "hi"; str1 = str; str1 = str1 + " there"; Log.e("TAG", "str " + str ); Result: hi Log.e("TAG", "str1 " + str1 ); Result : hi there
但是从上面的实验来看,就像:
Log.e("TAG", "str " + str ); Result: hi there //which is not the case
这让我很烦。
请解释为什么EditText会出现这种异常,以及Java中是否有任何技术术语。并指向任何能更好地解释这些资源或书籍。我对Android并不陌生,但这确实是。
谢谢!
之所以这样,是因为现在有两个相同变量的DIFFERENT实例,并且每个实例都侦听两个DIFFERENT侦听器。但同样,只有一个被击中。期望:
您正在调用同一参考上的二传手。最后一个获胜(它覆盖了前一个)
请解释为什么EditText会出现这种异常,以及Java中是否有一个专门的术语,并指向任何能更好地解释这种现象的资源或书籍。我对Android并不陌生,但这确实是。
分配参考不会复制对象。它与EditText不相关