Android 使用addTextChangedListener计算edittext值

Android 使用addTextChangedListener计算edittext值,android,android-layout,kotlin,android-edittext,addtextchangedlistener,Android,Android Layout,Kotlin,Android Edittext,Addtextchangedlistener,我有一个两个EditText和一个textview…textview值来自api,基于该值,我必须估计rest值 来自api的文本视图值是tv\u UOM\u值 第一个编辑文本id是tv\u UOM\u 0 第二个编辑文本id是tv\u UOM\u value\u 0 我必须处理两个案件:-- 1) 当我在tv\u UOM\u 0中键入值时,它应该添加tv\u UOM\u 0+tv\u UOM\u值并显示在tv\u UOM\u值0 2) 当我在tv\u-uu-value\u-0中键入值时,它应该

我有一个两个EditText和一个textview…textview值来自api,基于该值,我必须估计rest值

来自api的文本视图值是
tv\u UOM\u值
第一个编辑文本id是
tv\u UOM\u 0
第二个编辑文本id是
tv\u UOM\u value\u 0

我必须处理两个案件:--

1) 当我在
tv\u UOM\u 0
中键入值时,它应该添加
tv\u UOM\u 0
+
tv\u UOM\u值
并显示在
tv\u UOM\u值0

2) 当我在
tv\u-uu-value\u-0
中键入值时,它应该减去
tv\u-uu-value\u-0
-
tv\u-uu-value
并显示在
tv\u-uu-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) {
            }
        })
以上代码输出:-当我在first EditText中键入值时,设备挂起


需要帮助提前感谢…

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

它有点像这样:

@覆盖
public void PostTextChanged(可编辑){
如果(可编辑==第一次编辑文本。getEditableText()){
//做其他事情
}else if(可编辑==第二个编辑文本。getEditableText()){
//做其他事情
}
}

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

它有点像这样:

@覆盖
public void PostTextChanged(可编辑){
如果(可编辑==第一次编辑文本。getEditableText()){
//做其他事情
}else if(可编辑==第二个编辑文本。getEditableText()){
//做其他事情
}
}

请看一下

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

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

1.取消注册和重新注册侦听器(方便的方式) 让我们举一个例子:

当您要将值更改为
tv\u-UOM\u-0
(第二次编辑文本)时,
tv\u-UOM\u-0
(第一次编辑文本)的侦听器事件期间

那么,在打电话之前

tv____值_0.setText(${tv___值.text.toString().toInt()+tv___值0.text.toString().toInt()}”)
您应该删除侦听器,以便使用
tv_UOM_值_0再次编辑文本。删除TextChangedListener(tv_UOM_值_0的TextWatcher对象)在if/else条件之前,然后在if/else条件之后重新注册侦听器

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


2.检查EditText是否有焦点(直截了当的方式) 在这两个侦听器中,您应该检查给定的编辑文本是否具有焦点,如果没有焦点,只需返回即可

签出以下代码:

//电视计量单位0的侦听器方法
@SuppressLint(“SetTextI18n”)
覆盖后文本更改(p0:可编辑?){
如果(!tv_UOM_0.hasFocus()){
返回
}
if(p0?.isNotEmpty()==true){
tv_UOM_value_0.setText(${tv_UOM_value.text.toString().toInt()+tv_UOM_0.text.toString().toInt()})
}否则{
电视计量单位值0.setText(“”)
}
}

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

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

1.取消注册和重新注册侦听器(方便的方式) 让我们举一个例子:

当您要将值更改为
tv\u-UOM\u-0
(第二次编辑文本)时,
tv\u-UOM\u-0
(第一次编辑文本)的侦听器事件期间

那么,在打电话之前

tv____值_0.setText(${tv___值.text.toString().toInt()+tv___值0.text.toString().toInt()}”)
您应该删除侦听器,以便使用
tv_UOM_值_0再次编辑文本。删除TextChangedListener(tv_UOM_值_0的TextWatcher对象)在if/else条件之前,然后在if/else条件之后重新注册侦听器

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


2.检查EditText是否有焦点(直截了当的方式) 在这两个侦听器中,您应该检查给定的编辑文本是否具有焦点,如果没有焦点,只需返回即可

签出以下代码:

//电视计量单位0的侦听器方法
@SuppressLint(“SetTextI18n”)
覆盖后文本更改(p0:可编辑?){
如果(!tv_UOM_0.hasFocus()){
返回
}
if(p0?.isNotEmpty()==true){
tv_UOM_value_0.setText(${tv_UOM_value.text.toString().toInt()+tv_UOM_0.text.toString().toInt()})
}否则{
电视计量单位值0.setText(“”)
}
}

您有一个无限循环,其中更改一个文本字段将在第二个文本字段触发回调,而第二个文本字段将在第1个文本字段触发回调,循环将重复。你必须打破这个链条。我该怎么做@Francesc?你有一个无限循环,在这个循环中,更改一个文本字段会触发第二个回调,而第二个文本字段又会触发第1个回调,循环会重复。你必须打破锁链。我该怎么做@Francesc?谢谢jeel它起作用了…很好的解释谢谢jeel它起作用了…很好的解释