我希望能够根据3 EditText
中的2个中的输入来计算某些内容。例如:我在ET 1和2中输入 - >我在ET 3中得到一个计算.ET 1和3 - >在ET 2中计算......等等。
我让它与2 EditText
一起工作,但是我得到了一个StackOverFlowError。
private class GenericTextWatcher implements TextWatcher {
private View view;
private GenericTextWatcher(View view) {
this.view = view;
}
public void beforeTextChanged(CharSequence charSequence, int i, int i1,
int i2) {
}
public void onTextChanged(CharSequence charSequence, int i, int i1,
int i2) {
}
public void afterTextChanged(Editable editable) {
switch (view.getId()) {
case R.id.liter_input:
try {
if (amount_widget.getText().toString().equals(" ") == false
|| literPrice_widget.getText().toString()
.equals(" ") == false
|| price_widget.getText().toString().equals(" ") == false) {
double editTextCalc = Double.parseDouble(amount_widget
.getText().toString())
* Double.parseDouble(literPrice_widget
.getText().toString());
editTextCalc = Math.round(editTextCalc * 100) / 100.0;
price_widget.setText(String.valueOf(decimalFormat
.format(editTextCalc)));
}
} catch (Exception e) {
// TODO: handle exception
}
break;
case R.id.literprice_input:
try {
if (amount_widget.getText().toString().equals(" ") == false
|| literPrice_widget.getText().toString()
.equals(" ") == false
|| price_widget.getText().toString().equals(" ") == false) {
double editTextCalc = Double.parseDouble(amount_widget
.getText().toString())
* Double.parseDouble(literPrice_widget
.getText().toString());
editTextCalc = Math.round(editTextCalc * 100) / 100.0;
price_widget.setText(String.valueOf(decimalFormat
.format(editTextCalc)));
}
} catch (Exception e) {
// TODO: handle exception
}
break;
case R.id.price_input:
try {
if (amount_widget.getText().toString().equals(" ") == false
|| literPrice_widget.getText().toString()
.equals(" ") == false
|| price_widget.getText().toString().equals(" ") == false) {
double editTextCalc = Double.parseDouble(amount_widget
.getText().toString())
/ Double.parseDouble(price_widget.getText()
.toString());
editTextCalc = Math.round(editTextCalc * 100) / 100.0;
literPrice_widget.setText(String.valueOf(decimalFormat
.format(editTextCalc)));
}
} catch (Exception e) {
// TODO: handle exception
}
break;
}
}
}
答案 0 :(得分:1)
好的,我刚刚开始重新审核我的代码。为什么没有人找到答案?这真的不是那么难。
所以我只是将每个try块中的if-statements
与另一个if-statement
包围在一起,如下所示:
if(edittext.isFocused()){
try-catch block
}
现在一切正常。没有StackOverflowException
了,因为textwatcher
仅在edittext
关注的地方开始工作。文本更改不再触发无限循环。
答案 1 :(得分:0)
您应该检查EditText
中的更改是否因其他EditText
中的更改而发生。在课程中创建boolean
字段,并使用false
初始化它:
private boolean mIsChanging = false;
在afterTextChanged()
中检查此字段是false
还是退出:
public void afterTextChanged(Editable editable) {
if (mIsChanging) {
return;
}
mIsChanging = true;
// Then do what you did previously...
mIsChanging = false;
}
答案 2 :(得分:0)
可以使用Editable,您需要使用hashCodeFunction
@Override
public void afterTextChanged(Editable s) {
if (editText.getText().hashCode() == s.hashCode()) {
// some
}
}