2011-02-17 37 views
0

我已經編寫了一些代碼來測試用戶是否更改了6個編輯文本框中的任意值,但代碼看起來體積龐大且冗餘。我想知道是否有更優雅的方式來做到這一點。將注意力集中在多個編輯文本框

用戶將數字輸入到所有6個編輯文本框中,並且在每次輸入後,計算例程會在進行計算之前檢查所有框是否都有有效數字。 kistener必須在丟失的foucus上進行射擊,以便在計算完成之前將數字放在框中。並輸出結果。如果用戶想要返回並更改6個編輯文本框中任意一個的值,則會再次運行調用例程。 我在onCreate部分爲每個編輯文本框設置了6個監聽器。 然後我有6個獨立的例程來測試每個hasFocus == false。

內的onCreate區間i設置每個的6個用戶輸入edottext框收聽者:

et1.setOnFocusChangeListener(this); 
. 
. 
    . 
. 
et6.setOnFocusChangeListener(this); 

然後我不得不檢查是否有任何的EditText框已失去焦點,提示theat用戶改變了一些方法數據,並因此重新運行計算。
我做了檢查爲每個6用戶輸入的EditText框如下:

@Override 
public void onFocusChange(View v, boolean hasFocus) 
{ if ((v == findViewById(R.id.et1)) && (hasFocus==false)) 
     {do calculations } 
    . 
    . 
    . 
    . 
    if ((v == findViewById(R.id.et6)) && (hasFocus==false)) 
     {do calculations } 

} 

原諒我,如果我在代碼所做之上的任何錯別字。它運行在我的平臺上,但我想學習更好的方法來做到這一點。

回答

3

我認爲檢查哪個視圖已失去焦點是不必要的,除非計算取決於哪個盒子失去了焦點而不同。如果計算是一樣的,只是嘗試:

public void onFocusChange(View v, boolean hasFocus) { 
    if(!hasFocus) { 
     //do calculations 
    } 
} 

如果你只關心,六的一個已經失去重心,然後任何時間的焦點變化,只是檢查,看看它是否不集中,然後執行計算。

此外,僅供參考,檢查if(v.getId() == R.id.et1)而不是不必要地調用findViewById()會更有效。

編輯:只是想,沒有測試過這一點,但這樣的事情也可能更有效,使得只有當值改變實際發生計算:

private String last; 

public void onFocusChange(View v, boolean hasFocus) { 
    if(hasFocus) { 
     last = ((EditText)v).getText().toString();  
    } else { 
     if(!((EditText)v).getText().toString().equals(last)) { 
      //do calculations 
     } 
    } 
} 
+0

感謝您的代碼清潔的想法。 – 2011-02-17 20:23:49

2

你可能只如果文字實際發生了變化,則要進行更改。所以你應該爲你的edittext添加一個TextChangedListener。因此,對於每個編輯文本的的:

et1.addTextChangedListener(this); 
... 
et6.addTextChangedListener(this); 

然後,讓你的類實現TextWatcher

@Override 
public void afterTextChanged(Editable s) { 
    // do calculations 
} 
@Override 
public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
} 
@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
}  
+0

聰明!謝謝。 – 2011-02-17 20:22:06

相關問題