Android 使用Textwatcher时出现堆栈溢出错误
我有三个Edittext。当我更改first Edittext值时,第三个Edittext值将由Textwatcher更改。当我更改第三个Edittext时,第一个Edittext值将由Textwatcher更改。当我运行代码时,应用程序正在崩溃 这是我的密码Android 使用Textwatcher时出现堆栈溢出错误,android,Android,我有三个Edittext。当我更改first Edittext值时,第三个Edittext值将由Textwatcher更改。当我更改第三个Edittext时,第一个Edittext值将由Textwatcher更改。当我运行代码时,应用程序正在崩溃 这是我的密码 qty = (EditText) findViewById(R.id.qty); rate = (EditText) findViewById(R.id.rate); amount = (EditText) findVi
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
java.lang.StackOverflower错误
位于android.text.method.ReplacementTransformationMethod$ReplacementCharSequence.getChars(ReplacementTransformationMethod.java:151)
位于android.text.TextUtils.getChars(TextUtils.java:78)
位于android.text.TextUtils.indexOf(TextUtils.java:111)
位于android.text.StaticLayout.generate(StaticLayout.java:209)
在android.text.dynamiclayot.reflow(dynamiclayot.java:324)
位于android.text.DynamicLayout.(DynamicLayout.java:174)
在android.widget.TextView.makeSingleLayout上(TextView.java:6964)
位于android.widget.TextView.makeNewLayout(TextView.java:6813)
在android.widget.TextView.checkForRelayout(TextView.java:7409)中
位于android.widget.TextView.setText(TextView.java:4300)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$2.afterTextChanged(Delivery.java:127)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$2.afterTextChanged(Delivery.java:127)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$2.afterTextChanged(Delivery.java:127)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$2.afterTextChanged(Delivery.java:127)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
位于android.widget.TextView.setText(TextView.java:4137)
位于android.widget.EditText.setText(EditText.java:104)
位于android.widget.TextView.setText(TextView.java:4112)
位于com.example.admin.foms.Delivery$1.afterTextChanged(Delivery.java:93)
在android.widget.TextView.sendAfterTextChanged上(TextView.java:8293)
位于android.widget.TextView.setText(TextView.java:4307)
在android.widget.TextView.setText(TextView
您已经在编辑文本
(数量
和金额
)上设置了文本观察者
,并且您正在文本更改
上设置备用编辑文本
在更改
amount
EditText
中的文本后,它将更改amount
EditText
中的值(由于TextWatcher
),现在amount
值已更改,因此它将再次尝试更改amount EditText
的值(由于TextWatcher
)然后过程继续。在文本查看器的最后一行出现堆栈溢出错误,将当前文本与要设置的文本进行比较。如果它们相等,则不要设置文本。这将避免无休止的循环。您可以执行以下操作:
// temporary disable the listener
edt.removeTextChangedListener(this);
// change the text
edt.setText("Some text");
// enable it again
edt.addTextChangedListener(this);
根据,为了避免在更改文本时出现递归,可以将flag设置为posterextch
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));
}
qty.addTextChangedListener(new TextWatcher() {
...
@Override
public void afterTextChanged(Editable s) {
if (qty.getText().toString().equals(s.toString())){return;}
...
}
};