微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 addTextChangedListener 计算 edittext 值

如何解决使用 addTextChangedListener 计算 edittext 值

我有两个 editext 和一个 textview...textview 值来自 api 并且基于我必须估计其余值的值...

来自 api 的 textview 值是 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

以下是我的代码:-

 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?,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?,p3: Int) {
            }
            override fun onTextChanged(p0: CharSequence?,p3: Int) {
            }
        })

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

需要帮助提前致谢...

解决方法

您的问题是您的代码正在创建无限循环,其中 EditText 的侦听器在值更改时相互调用。

有两种方法可以处理这种情况:

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

让我们在这里举个例子:

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

所以,在打电话之前

tv_UOM_value_0.setText("${tv_UOM_value.text.toString().toInt() + tv_UOM_0.text.toString().toInt()}")

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

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


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

在两个侦听器期间,您应该检查给定的编辑文本是否有焦点,如果没有焦点则简单地返回。

查看以下代码:

// 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("")
    }
}
,

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

有点像这样:

@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 
    }
}

请查看Android Documentation on TextWatcher

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。