使用 addTextChangedListener 计算 edittext 值

compute the edittext value using addTextChangedListener

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

来自 api 的文本视图值是 tv_UOM_value 第一个 edittext id 是 tv_UOM_0 第二个 edittext 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?, 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) {
            }
        })

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

需要帮助提前致谢...

我认为实现一个 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

您的问题是您的代码正在创建无限循环,当值更改时,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是否有焦点(简单的方法)

在两个监听器中,您应该检查给定的编辑文本是否有焦点,如果没有焦点,只需 return。

检查下面的代码:

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