Android 使用addTextChangedListener计算edittext值
我有一个两个EditText和一个textview…textview值来自api,基于该值,我必须估计rest值 来自api的文本视图值是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中键入值时,它应该
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它起作用了…很好的解释