我正在尝试根据以下任何输入计算该人获得的工资 - 每小时,每天,每周,每月,每年。当其中一个进入时,其他的应该自动重新计算。
以下是我的工作方式:
首先,我在活动顶部定义了5个Double
类型变量。它们是:每小时,每天,每周,每月,每年。然后我有5个EditText字段,对应于这些变量。我已经为这5个EditTexts附加了一个实现TextWatcher
的自定义子类。
例如:
etHourly = (EditText) findViewById(R.id.etHourly);
etHourly.addTextChangedListener(new EditTextWatcher(etHourly));
这个自定义类有一个构造函数,它接受并存储传递给它的视图,因为TextWatcher
类的默认方法没有提供一种方法来找出哪个View调用了这个更改。
将传递的视图保存为自定义子类内的局部变量后,继续执行此子类中的实现afterTextChanged
并获取传递的EditText的值并将其保存为Double
活动顶部的相应定义变量。 (例如,如果传递的EditText是针对每周工资,我将此EditText的值设置为weekly
变量的双倍。
最后,就在afterTextChanged
方法结束之前,我调用另一个自定义方法Recalculate()
,它有一堆if()
来检查每小时,每天,每周,每月或者设置年度,如果是,则在剩余的EditText上计算并使用setText()
。问题是这个setText()
将为每个EditTexts调用TextWatchers,导致无限循环。
我如何克服这个问题?
这里有一些代码可以更好地理解这一点。在onCreate之前:
Double hourly, daily, weekly, monthly, yearly = 0.0;
EditText etHourly, etDaily, etWeekly, etMonthly, etYearly;
在onCreate()中:
etHourly = (EditText) findViewById(R.id.etHourly);
etDaily = (EditText) findViewById(R.id.etDaily);
etWeekly = (EditText) findViewById(R.id.etWeekly);
etMonthly = (EditText) findViewById(R.id.etMonthly);
etYearly = (EditText) findViewById(R.id.etYearly);
etHourly.addTextChangedListener(new EditTextWatcher(etHourly));
etDaily.addTextChangedListener(new EditTextWatcher(etDaily));
etWeekly.addTextChangedListener(new EditTextWatcher(etWeekly));
etMonthly.addTextChangedListener(new EditTextWatcher(etMonthly));
etYearly.addTextChangedListener(new EditTextWatcher(etYearly));
EditTextWatcher
子类:
private class EditTextWatcher implements TextWatcher {
EditText v;
public EditTextWatcher(EditText view) {
this.v = view;
}
public void afterTextChanged(Editable s) {
Reinit();
// Only if the currently edited text field contains something
if (v.getText().toString().length() > 0) {
switch (v.getId()) {
case R.id.etHourly:
hourly = getTvAsDouble(etHourly);
break;
case R.id.etDaily:
daily = getTvAsDouble(etDaily);
break;
case R.id.etWeekly:
weekly = getTvAsDouble(etWeekly);
break;
case R.id.etMonthly:
monthly = getTvAsDouble(etMonthly);
break;
case R.id.etYearly:
yearly = getTvAsDouble(etYearly);
break;
default:
}
}
Recalculate();
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
}
REINIT():
hourly = daily = weekly = monthly = yearly = 0.0;
重新计算():
if(hourly!=null && hourly>0.0){
etDaily.setText(String.valueOf(hourly*8));
}
// I will complete the other if's once this works
答案 0 :(得分:4)
交配!!我也被困在这里......我得到的是StackOverflowError ...但是我假设这可能是因为我已多次实例化TextWatcher ...但是你通过识别问题帮助我,实际上是用setText( ),无限地调用TextWatcher的方法....所以在这里我做了 - 根据你的代码--->
if(hourly!=null && hourly>0.0){
if(etHourly.isFocused()) //this condition helped suppressing infinite loops
etDaily.setText(String.valueOf(hourly*8));}