我有三个Edittext。当我更改第一个Edittext值时,第三个Edittext值将由Textwatcher更改。当我更改第三个Edittext时,第一个edittext值将由Textwatcher更改。当我运行代码时,正在删除。
这是我的代码
qty = (EditText) findViewById(R.id.qty);
rate = (EditText) findViewById(R.id.rate);
amount = (EditText) findViewById(R.id.amount);
qty.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
String qtyvalue = qty.getText().toString();
String ratevalue = rate.getText().toString();
if (qtyvalue.equals("") || ratevalue.equals("")) {
val1 = 0d;
val2 = 0d;
} else {
val1 = Double.parseDouble(qtyvalue);
val2 = Double.parseDouble(ratevalue);
}
amount.setText(Double.toString(val1 * val2));
}
});
amount.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
String amountvalue = amount.getText().toString();
String ratevalue = rate.getText().toString();
if (amountvalue.equals("") || ratevalue.equals("")) {
val3 = 0d;
val4 = 0d;
} else {
val3 = Double.parseDouble(amountvalue);
val4 = Double.parseDouble(ratevalue);
}
System.out.println(Double.toString((double)val3/val4));
qty.setText(Double.toString((double)val3/val4));
}
});
logcat的
java.lang.StackOverflowError
at android.text.method.ReplacementTransformationMethod$ReplacementCharSequence.getChars(ReplacementTransformationMethod.java:151)
at android.text.TextUtils.getChars(TextUtils.java:78)
at android.text.TextUtils.indexOf(TextUtils.java:111)
at android.text.StaticLayout.generate(StaticLayout.java:209)
at android.text.DynamicLayout.reflow(DynamicLayout.java:324)
at android.text.DynamicLayout.<init>(DynamicLayout.java:174)
at android.widget.TextView.makeSingleLayout(TextView.java:6964)
at android.widget.TextView.makeNewLayout(TextView.java:6813)
at android.widget.TextView.checkForRelayout(TextView.java:7409)
at android.widget.TextView.setText(TextView.java:4300)
at android.widget.TextView.setText(TextView.java:4137)
at android.widget.EditText.setText(EditText.java:104)
at android.widget.TextView.setText(TextView.java:4112)
at com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
at android.widget.TextView.setText(TextView.java:4307)
at android.widget.TextView.setText(TextView.java:4137)
at android.widget.EditText.setText(EditText.java:104)
at android.widget.TextView.setText(TextView.java:4112)
at com.example.admin.foms.Delivery$2.afterTextChanged(Delivery.java:127)
at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
at android.widget.TextView.setText(TextView.java:4307)
at android.widget.TextView.setText(TextView.java:4137)
at android.widget.EditText.setText(EditText.java:104)
at android.widget.TextView.setText(TextView.java:4112)
at com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
at android.widget.TextView.setText(TextView.java:4307)
at android.widget.TextView.setText(TextView.java:4137)
at android.widget.EditText.setText(EditText.java:104)
at android.widget.TextView.setText(TextView.java:4112)
at com.example.admin.foms.Delivery$2.afterTextChanged(Delivery.java:127)
at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
at android.widget.TextView.setText(TextView.java:4307)
at android.widget.TextView.setText(TextView.java:4137)
at android.widget.EditText.setText(EditText.java:104)
at android.widget.TextView.setText(TextView.java:4112)
at com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
at android.widget.TextView.setText(TextView.java:4307)
at android.widget.TextView.setText(TextView.java:4137)
at android.widget.EditText.setText(EditText.java:104)
at android.widget.TextView.setText(TextView.java:4112)
at com.example.admin.foms.Delivery$2.afterTextChanged(Delivery.java:127)
at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
at android.widget.TextView.setText(TextView.java:4307)
at android.widget.TextView.setText(TextView.java:4137)
at android.widget.EditText.setText(EditText.java:104)
at android.widget.TextView.setText(TextView.java:4112)
at com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
at android.widget.TextView.setText(TextView.java:4307)
at android.widget.TextView.setText(TextView.java:4137)
at android.widget.EditText.setText(EditText.java:104)
at android.widget.TextView.setText(TextView.java:4112)
at com.example.admin.foms.Delivery$2.afterTextChanged(Delivery.java:127)
at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
at android.widget.TextView.setText(TextView.java:4307)
at android.widget.TextView.setText(TextView.java:4137)
at android.widget.EditText.setText(EditText.java:104)
at android.widget.TextView.setText(TextView.java:4112)
at com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
at android.widget.TextView.sendAfterTextChanged(TextView.java:8293)
at android.widget.TextView.setText(TextView.java:4307)
at android.widget.TextView.setText(TextView
答案 0 :(得分:2)
根据this answer,为了避免在更改文本时递归,可以将标志设置为afterTextChanged
方法,如下所示:
boolean preventUpdate = false;
@Override
public void afterTextChanged(Editable s) {
if(preventUpdate){
preventUpdate = false; // reset flag after calling
return;
}
// your logic
// prevent update after change value
preventUpdate = true;
qty.setText(Double.toString((double)val3/val4));
}
如果两个EdiText
更改了彼此的文字,您应该添加另一个标记,以确保他们不会再次通知文本更改(考虑您的逻辑,无论何时您想使用{{1} } 方法 )。
答案 1 :(得分:0)
您已在TextWatcher
(EditText
和qty
)上设置了amount
,并且您在EditText
上的候补TextChange
上设置了文字。
更改amount
EditText
中的文字后,它会更改qty
EditText
中的值(因为TextWatcher
),现在qty
{{ 1}}值为更改,因此它会再次尝试更改EditText
的值(因为amount EditText
)并继续处理..并且出现 TextWatcher
错误
答案 2 :(得分:0)
// temporary disable the listener
edt.removeTextChangedListener(this);
// change the text
edt.setText("Some text");
// enable it again
edt.addTextChangedListener(this);
答案 3 :(得分:0)
stackoverflow的原因是由于TextWatcher()而导致的无限循环,即EditTextA更改了w.r.t. EditTextB,反之亦然。因此,创建一个无限循环,堆栈会因函数的局部变量而耗尽。
解:
简单的解决方案是在当前文本和新文本相同时阻止更新。
qty.addTextChangedListener(new TextWatcher() {
...
@Override
public void afterTextChanged(Editable s) {
if (qty.getText().toString().equals(s.toString())){return;}
...
}
};
取消注册观察者,然后重新注册。 How can I change the EditText text without triggering the Text Watcher?
第三种解决方案是,您可以区分手动设置和以编程方式设置编辑文本。 EditText: Differentiate between text change by setText() or by keyboard input
答案 4 :(得分:-1)
在文本观察程序的最后一行中,将当前文本与要设置的文本进行比较。如果它们相同,则不要设置文本。这将避免无休止的循环。