2012-11-24 61 views
0

這就是我想要做的: 我有一個活動,其中有20-25個EditText。當EditText的文本改變時,一些相應的TextView的文本必須改變。即用戶輸入他每月的雜貨支出,所以顯示其年度雜貨開支的TextView得到更新,每月和每年的總支出TextView也得到更新。在Android上觀察多個EditText進行文本更改

我知道我可以用TextWatcher.But做到這一點,那麼我需要爲每個EditText單獨的TextWatcher。即使我編寫了一個自定義的TextWatcher來保存EditText的Id,並在switch-case塊中執行適當的操作,但在這種情況下,我需要爲每個EditText創建一個新的類實例。這不是非常低效和消耗內存嗎?

我一直希望能有像OnClickListener這樣的東西,所以我只需要重寫一些函數,它將執行所有按鈕在我的活動中的所有任務,我只需要重寫onClick(View v)函數並完成。有沒有辦法做到這一點?

回答

0

您無法避免使用TextWatcher來「查看」EditText上的輸入事件。前段時間我回答了a similar question,稍作修改就可以用它來使事情變得簡單。在我的答案中,您可能需要修改onInputChange()方法以返回EditText的ID,以便知道誰觸發了文本輸入。

+0

你能解釋我怎麼才能得到觸發事件的'EditText'的id? – Mehedi

+0

@Mehedi擁有該ID的唯一方法是將其傳遞給'TextWatcher'實現,就像您在問題中已經提到的那樣。我已經編輯了我以前的示例以合併id,你可以在https://gist.github.com/4140851找到它。不要擔心內存佔用或性能問題,那些'TextWatcher'實例不會成爲問題。 – Luksprog

+0

感謝您的評論。我想我沒有別的選擇去嘗試除此之外的其他選擇。我會嘗試一下,讓你知道它是如何去的。 – Mehedi

1

怎麼是這樣的:

yourEditText1.setOnFocusChangeListener(yourFocusChangeListener); 
yourEditText2.setOnFocusChangeListener(yourFocusChangeListener); 

View.OnFocusChangeListener yourFocusChageListener = new View.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if (!hasFocus) { 
      // Update your textview depending on which edittext lost focus 
     } 
    } 
}); 

在TextWatcher(IMO)這樣做的好處是,你知道用戶完成,因爲他們已導航從EditText上了。唯一的問題是,他們需要導航離開它(不知道如果這將是一個showstopper爲您或不)。

+0

這可以做得很明顯,但我想讓聽衆像TextWatcher一樣立刻開火。感謝您的評論。 – Mehedi