如果我将一个EditText分配给另一个EditText,为什么它们指向相同的值?

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并不陌生,但这确实是。

谢谢!

Bla*_*elt 7

之所以这样,是因为现在有两个相同变量的DIFFERENT实例,并且每个实例都侦听两个DIFFERENT侦听器。但同样,只有一个被击中。期望:

您正在调用同一参考上的二传手。最后一个获胜(它覆盖了前一个)

请解释为什么EditText会出现这种异常,以及Java中是否有一个专门的术语,并指向任何能更好地解释这种现象的资源或书籍。我对Android并不陌生,但这确实是。

分配参考不会复制对象。它与EditText不相关