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