使用 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
}
}
您的问题是您的代码正在创建无限循环,当值更改时,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("")
}
}
我有两个 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
}
}
您的问题是您的代码正在创建无限循环,当值更改时,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("")
}
}