在我的应用程序中,有两个EditText和一个TextView。我已经在这两个EditText上设置了Two Textwatcher。基于该EditText中的值,另一个EditText的值被更改,并且它也适用于textView。一切都很好。但是,如果我将另一个Edittext设置为类似于要根据另一个EditText的值进行更改的值,则会出现stackOverflow错误。我不知道我错在哪里。并且我不能将两个EditText的TextWatcher放在一起来改变彼此的值。
请帮帮我。谢谢。代码:
amountText.setText(""); // TextView
excludedText.setText(""); // EditText
includedText.setText(""); // EditText
includedText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(!(includedText.getText().toString().equals("")))
{
double included = Double.parseDouble(includedText.getText().toString());
included = roundTwoDecimals(included);
// double amountValue = (excluded*15/100);
String amt = String.valueOf(roundTwoDecimals(included-(included/1.15)));
String excluded = String.valueOf(included/1.15);
System.out.println("The Amount is: "+amt);
amountText.setText(amt);
try{
excludedText.setText("");
excludedText.setText(excluded); //////// Error Line
}
catch(Exception e)
{
e.printStackTrace();
}
}
else
{
amountText.setText("");
excludedText.setText(""); // Error line
}
}
@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
}
});
excludedText.addTextChangedListener(new TextWatcher()
{
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(!(excludedText.getText().toString().equals("")))
{
double excluded = Double.parseDouble(excludedText.getText().toString());
excluded = roundTwoDecimals(excluded);
String amt = String.valueOf(roundTwoDecimals(excluded*0.15));
String included = String.valueOf(roundTwoDecimals(excluded+(excluded*0.15)));
System.out.println("The Amount is: "+amt);
amountText.setText(amt);
includedText.setText(included);
}
else
{
amountText.setText("");
includedText.setText("");
}
}
@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
}
});
下面是我的Logcat:
10-11 09:47:28.288: ERROR/AndroidRuntime(363): FATAL EXCEPTION: main
10-11 09:47:28.288: ERROR/AndroidRuntime(363): java.lang.StackOverflowError
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.text.DynamicLayout.reflow(DynamicLayout.java:261)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.text.DynamicLayout.<init>(DynamicLayout.java:150)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.makeNewLayout(TextView.java:4851)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.checkForRelayout(TextView.java:5348)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2688)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2556)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.EditText.setText(EditText.java:75)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2531)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at com.project.TaxCalculator.GSTActivity$1.onTextChanged(GSTActivity.java:73)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.sendOnTextChanged(TextView.java:6131)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2691)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2556)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.EditText.setText(EditText.java:75)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2531)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at com.project.TaxCalculator.GSTActivity$2.onTextChanged(GSTActivity.java:111)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.sendOnTextChanged(TextView.java:6131)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2691)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2556)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.EditText.setText(EditText.java:75)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2531)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at com.project.TaxCalculator.GSTActivity$1.onTextChanged(GSTActivity.java:73)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.sendOnTextChanged(TextView.java:6131)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2691)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2556)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.EditText.setText(EditText.java:75)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2531)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at com.project.TaxCalculator.GSTActivity$2.onTextChanged(GSTActivity.java:111)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.sendOnTextChanged(TextView.java:6131)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2691)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2556)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.EditText.setText(EditText.java:75)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2531)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at com.project.TaxCalculator.GSTActivity$1.onTextChanged(GSTActivity.java:73)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.sendOnTextChanged(TextView.java:6131)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2691)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2556)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.EditText.setText(EditText.java:75)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2531)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at com.project.TaxCalculator.GSTActivity$2.onTextChanged(GSTActivity.java:111)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.sendOnTextChanged(TextView.java:6131)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2691)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2556)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.EditText.setText(EditText.java:75)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2531)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at com.project.TaxCalculator.GSTActivity$1.onTextChanged(GSTActivity.java:73)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.sendOnTextChanged(TextView.java:6131)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2691)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2556)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.EditText.setText(EditText.java:75)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2531)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at com.project.TaxCalculator.GSTActivity$2.onTextChanged(GSTActivity.java:111)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.sendOnTextChanged(TextView.java:6131)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2691)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2556)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.EditText.setText(EditText.java:75)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2531)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at com.project.TaxCalculator.GSTActivity$1.onTextChanged(GSTActivity.java:73)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.sendOnTextChanged(TextView.java:6131)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2691)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2556)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.EditText.setText(EditText.java:75)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2531)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at com.project.TaxCalculator.GSTActivity$2.onTextChanged(GSTActivity.java:111)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.sendOnTextChanged(TextView.java:6131)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextView.setText(TextView.java:2691)
10-11 09:47:28.288: ERROR/AndroidRuntime(363): at android.widget.TextVie
请参考这个日志并帮助我解决它。谢谢。
发布于 2011-10-11 12:51:02
这是一个stackoverflow
的问题,你要去无限循环。
您正在从第二个edittext更新一个edittext的值,反之亦然。
例如::
当你在第一次编辑文本中输入字符时,它将设置第二次编辑文本的文本,而在第二次编辑文本中,你已经编写了一段代码来设置第一次编辑文本的文本,这样你就会进入无限循环。
编辑
et1 = (EditText)findViewById(R.id.et1);
et2 = (EditText)findViewById(R.id.et2);
OnKeyListener onKeyListener = new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
String str = ((EditText)v).getText().toString();
if(v == et1) {
et2.setText(str);
}else {
et1.setText(str);
}
return false;
}
};
et1.setOnKeyListener(onKeyListener);
et2.setOnKeyListener(onKeyListener);
发布于 2011-10-11 15:25:06
您可以尝试将代码放入"afterTextChanged“中,但我认为这将导致相同的无限循环。这就是为什么我不明白为什么这两个输入可以相互依赖,意思是,如果EditText-A改变了ET-B的文本,那么ET-B如何再次改变ET-A中的文本,这没有任何意义。
发布于 2011-10-11 15:37:22
每次在EditText中更改文本时,都会调用TextWatcher (如果定义了它,并且取决于您实现了哪些被覆盖的方法)。因此,根据您想要完成的任务,如果EditText A的文本被编辑,那么TextWatcher将被调用并编辑EditText B的文本,然后TextWatcher调用其相应的TextWatcher,EditText A的文本将被调用...简而言之,这是一种糟糕的做法。
https://stackoverflow.com/questions/7721327
复制相似问题