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