首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用addTextChangedListener计算编辑文本值

使用addTextChangedListener计算编辑文本值
EN

Stack Overflow用户
提问于 2021-04-20 16:20:23
回答 2查看 385关注 0票数 0

我有两个编辑文本,一个textview...textview值来自api,基于这个值我必须估计rest值.

来自api的文本视图值是tv_UOM_value,第一个编辑文本id是tv_UOM_0,第二个编辑文本id是tv_UOM_value_0

有两件事我要处理:--

1)在tv_UOM_0中输入值时,应添加tv_UOM_0 + tv_UOM_value,并在tv_UOM_value_0中显示

2)在tv_UOM_value_0中输入值时,应减去tv_UOM_value_0 - tv_UOM_value,并以tv_UOM_0显示。

以下是我的代码:-

代码语言:javascript
复制
 tv_UOM_0.addTextChangedListener(object:TextWatcher{
        @SuppressLint("SetTextI18n")
        override fun afterTextChanged(p0: Editable?) {
            if(p0?.isNotEmpty() == true){
                tv_UOM_value_0.setText(
                        "${tv_UOM_value.text.toString()
                                .toInt() + tv_UOM_0.text.toString().toInt()}"
                    )
            }else{
                tv_UOM_value_0.setText("")
            }
        }
        override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }
        override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }
    })
        tv_UOM_value_0.addTextChangedListener(object:TextWatcher{
            @SuppressLint("SetTextI18n")
            override fun afterTextChanged(p0: Editable?) {
                if (p0?.isNotEmpty() == true) {
                        tv_UOM_0.setText(
                                "${tv_UOM_value_0.text.toString()
                                        .toInt() - tv_UOM_value.text.toString().toInt()}"
                        )
                    }
                else{
                    tv_UOM_0.setText("")
                }
            }
            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
            }
            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
            }
        })

上面的代码输出:-当我在第一个编辑文本中键入值时,设备将挂起

需要帮助谢谢..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-21 07:00:53

您的问题是,您的代码正在创建无限循环,当值发生变化时,两个EditText的侦听器相互调用。

有两种处理此场景的方法:

1.注销和重新注册侦听器(方便的方式)

让我们举一个例子:

tv_UOM_0 (第一次编辑文本)的侦听器事件期间,当您希望将值更改为tv_UOM_value_0 (第二编辑文本)时。

所以,在打电话之前

代码语言:javascript
复制
tv_UOM_value_0.setText("${tv_UOM_value.text.toString().toInt() + tv_UOM_0.text.toString().toInt()}")

您应该删除侦听器,在if/ text条件之前使用tv_UOM_value_0.removeTextChangedListener(textWatcherObject for tv_UOM_value_0);,然后在if/else条件之后再次重新注册侦听器,再次编辑文本。

第二次编辑文本侦听器的代码也是如此。

2.检查EditText是否有焦点(直接方式)

在这两个侦听器中,您应该检查给定的编辑文本是否有焦点,如果没有焦点,只需返回即可。

检查下面的代码:

代码语言:javascript
复制
// Listener method of tv_UOM_0
@SuppressLint("SetTextI18n")
override fun afterTextChanged(p0: Editable?) {
    if(!tv_UOM_0.hasFocus()) {
        return
    }
    if(p0?.isNotEmpty() == true){
        tv_UOM_value_0.setText("${tv_UOM_value.text.toString().toInt() + tv_UOM_0.text.toString().toInt()}")
    } else {
        tv_UOM_value_0.setText("")
    }
}
票数 2
EN

Stack Overflow用户

发布于 2021-04-21 06:50:46

我认为,在两个TextWatcher字段中的任何一个上实现一个对文本更改作出反应的EditText将对您有所帮助。这样,您就可以完全控制应该在哪个字段中修改的内容。

它会有点像这样:

代码语言:javascript
复制
@Override
public void afterTextChanged(Editable editable) {
    if (editable == first_edit_text.getEditableText()) {
        // do other things 
    } else if (editable == second_edit_text.getEditableText()) {
       // do other things 
    }
}

请看一下TextWatcher上的Android文档

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67182696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档