2012-09-18 87 views
0

我試圖根據以下任何輸入 - 小時,每日,每週,每月,每年計算該人收到的薪水。當其中一個輸入時,其他的應該自動重新計算。將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 
+0

可能重複://計算器。 COM /問題/ 12436105 /的keyReleased等價功能於機器人) – nandeesh

回答

4

伴侶!我也被困在這裏....我得到了StackOverflowError ...但我假設也許這是因爲我已經多次實例化了TextWatcher ......但是你通過識別問題來幫助我,這實際上是用setText ),這是調用TextWatcher的方法無限....所以在這裏我做到了---按你的代碼---> [Android中的keyReleased等價(HTTP的

if(hourly!=null && hourly>0.0){ 
if(etHourly.isFocused()) //this condition helped suppressing infinite loops 
    etDaily.setText(String.valueOf(hourly*8));} 
相關問題