【问题标题】:compute the edittext value using addTextChangedListener使用 addTextChangedListener 计算 edittext 值
【发布时间】:2021-07-14 20:55:57
【问题描述】:

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

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

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

需要帮助提前谢谢...

【问题讨论】:

  • 您有一个无限循环,其中更改一个文本字段会在 2 日触发回调,这反过来又会在 1 日触发回调并重复循环。你必须打破链条。
  • 我应该怎么做@Francesc?

标签: android android-layout kotlin android-edittext addtextchangedlistener


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多