Java 为什么这个简单的android应用程序是递归的?
这里有一个新用户,而且对Java相当陌生。运行此命令时,它会崩溃,并出现java.lang.stackoverflow错误。我相当肯定它是递归的,但我不知道为什么。我尝试过单步调试,但出现了一个错误,它找不到类文件。代码如下:Java 为什么这个简单的android应用程序是递归的?,java,android,recursion,android-edittext,textview,Java,Android,Recursion,Android Edittext,Textview,这里有一个新用户,而且对Java相当陌生。运行此命令时,它会崩溃,并出现java.lang.stackoverflow错误。我相当肯定它是递归的,但我不知道为什么。我尝试过单步调试,但出现了一个错误,它找不到类文件。代码如下: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
newPrice.addTextChangedListener(tradeWatch);
tradeIn.addTextChangedListener(tradeWatch);
acc.addTextChangedListener(tradeWatch);
tradeDif.addTextChangedListener(tradeWatch);
}
TextWatcher tradeWatch = new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
calcTrade();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}
};
private void calcTrade() {
Editable eValue1 = newPrice.getText(), eValue2 = tradeIn.getText(), eValue3 = acc.getText();
Double value1 = 0.0, value2 = 0.0, value3 = 0.0, result = 0.0;
if (eValue1 != null)
value1 = toDouble(eValue1);
if (eValue2 != null)
value2 = toDouble(eValue2);
if (eValue3 != null)
value3 = toDouble(eValue3);
if (value1 != null && value2 != null && value3 != null)
result = value1 - (value2 + value3);
tradeDif.setText(result.toString());
}
private double toDouble(final Editable editable) {
final String content = editable.toString();
if (content.isEmpty()) {
return 0;
}
return Double.parseDouble(content);
}
public void nextPage(View v) {
Intent i=new Intent(this, Activity2.class);
startActivity(i);
}
}
问题是线路:
tradeDif.setText(result.toString());
您更改文本,它会导致调用
afterTextChanged(Editable s)
一次又一次
简单解
tradeDif.setText(result.toString());
您更改文本,它会导致调用
afterTextChanged(Editable s)
一次又一次
简单解
问题是您的
tradeDif
正在使用您的tradeWatch
TextWatcher。在该TextWatcher的PostTextChanged()
,您调用calcTrade()
,它调用tradeDif.setText(result.toString())代码>
安卓在tradeDif
上完成文本设置后,它将再次在您的TextWatcher上调用afterTextChanged()
,并将继续这样做,直到您停止设置tradeDif
的文本。问题是您的tradeDif
正在使用您的tradeWatch
文本Watcher。在该TextWatcher的PostTextChanged()
,您调用calcTrade()
,它调用tradeDif.setText(result.toString())代码>
Android在tradeDif
上完成文本设置后,它将再次调用TextWatcher上的afterTextChanged()
,并将继续这样做,直到您停止设置tradeDif
的文本。您的TextWatcher
调用calcTrade()
,设置文本,调用TextWatcher
。为什么tradeDif.addTextChangedListener(tradeWatch)
?您的TextWatcher
调用calcTrade()
,设置文本,调用TextWatcher
。为什么tradeDif.addTextChangedListener(tradeWatch)代码>?如何修复此问题?问题是editText“tradeDif”还将进一步用于更多类似的计算。例如,这部分计算差异,但我也希望能够使用“tradeDif”来计算超出这一点的差异,使用类似的技术。如果不了解应用程序的工作原理以及用户使用应用程序的一般流程,很难说。一种解决方案是将tradeDif
设置为不可编辑的文本视图,而不是EditText,并可能在以后使用不同的字段。或者,在您再次尝试计算和设置tradeDif
之前,您可以输入一个标志,例如hasculateddif
。谢谢您的时间。虽然这是一个愚蠢的问题,我本应该发现的,但我希望我没有被否决。我希望能够为愿意提供帮助的人添加代表。如果我有足够的代表给其他人提供代表,我将返回并添加代表。我如何解决这个问题?问题是editText“tradeDif”还将进一步用于更多类似的计算。例如,这部分计算差异,但我也希望能够使用“tradeDif”来计算超出这一点的差异,使用类似的技术。如果不了解应用程序的工作原理以及用户使用应用程序的一般流程,很难说。一种解决方案是将tradeDif
设置为不可编辑的文本视图,而不是EditText,并可能在以后使用不同的字段。或者,在您再次尝试计算和设置tradeDif
之前,您可以输入一个标志,例如hasculateddif
。谢谢您的时间。虽然这是一个愚蠢的问题,我本应该发现的,但我希望我没有被否决。我希望能够为愿意提供帮助的人添加代表。如果我有足够的代表给其他人,我会返回并添加代表。