热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

如何解决《如果我将一个EditText分配给另一个EditText,为什么它们指向相同的值?》经验,为你挑选了1个好方法。

今天,我遇到了这个非常有趣的情况。

假设:

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

谢谢!



1> Blackbelt..:

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

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

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

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


推荐阅读
author-avatar
深深i
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有