我試圖根據以下任何輸入 - 小時,每日,每週,每月,每年計算該人收到的薪水。當其中一個輸入時,其他的應該自動重新計算。將TextWatcher類附加到多個沒有無限循環的EditText
我是這樣進行:
首先,我必須在活動的頂部定義5個Double
類型變量。他們是:小時,每日,每週,每月,每年。然後我有5個EditText字段,對應於這些變量。我附加了一個自定義的子類,它爲這5個EditTexts實現了TextWatcher
。
例如:
etHourly = (EditText) findViewById(R.id.etHourly);
etHourly.addTextChangedListener(new EditTextWatcher(etHourly));
這個自定義類有一個構造函數接受並存儲傳遞給它的視圖,自TextWatcher
類的默認方法不提供一種方式來找出哪些視圖調用了更改。
保存通過查看自定義子我再用這個子類中,實現的afterTextChanged
進行並獲得通過的EditText的值,並將其作爲一個Double
保存到其對應的定義的變量在頂部內部的局部變量之後活動。 (例如,如果通過的EditText對於週薪,我設置的EditText的值作爲雙到weekly
變量。
最後,只是afterTextChanged
方法結束之前,我調用另一個自定義的方法Recalculate()
,有一串if()
的檢查是否設置了每小時,每天,每週,每月或每年,如果是,計算並使用setText()
對剩餘的EditText's。問題是這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) {
}
}
重新初始化():
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
可能重複://計算器。 COM /問題/ 12436105 /的keyReleased等價功能於機器人) – nandeesh