我有两个编辑文本,一个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显示。
以下是我的代码:-
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) {
}
})上面的代码输出:-当我在第一个编辑文本中键入值时,设备将挂起
需要帮助谢谢..。
发布于 2021-04-21 07:00:53
您的问题是,您的代码正在创建无限循环,当值发生变化时,两个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/ text条件之前使用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("")
}
}发布于 2021-04-21 06:50:46
我认为,在两个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
}
}https://stackoverflow.com/questions/67182696
复制相似问题