2012-10-03 59 views
0

我有一個20 EditTexts它的活動。如果輸入了任何內容,我想顯示一條消息。有沒有辦法知道輸入是否被提供(數據改變)?如何知道用戶是否在沒有字段監聽器的情況下進行了輸入?

+1

最簡單的方法是將一個'TextWatcher'附加到這些'EditTexts',並且如果你看到在'afterTextChanged'方法中得到文本,那麼你就會知道你有一個'EditTexts'輸入。 – Luksprog

+0

我正在尋找一種解決方案,不涉及所有字段監聽器,如我的問題所述。例如,也許是活動更改的通用聽衆?鍵盤輸入..等等? – Snake

回答

1

一個想法,這是一個基類,它是在使用他們的任何EditText小部件(如果有的話)通知子類的保健的一個例子。根據你在用戶輸入內容時你想要做什麼,你可能需要改變我的示例以適合你的特定情況。

基地活動從中你會繼承:

public abstract class BaseTextWatcherActivity extends Activity { 

    private TextWatcher mInputObserver = new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      onInputChange(s.toString()); 
     } 
    }; 
    private boolean mOptimize = false; 

    @Override 
    public void setContentView(int layoutResID) { 
     View content = getLayoutInflater().inflate(layoutResID, null); 
     initInputsObservers((ViewGroup) content); 
     mOptimize = true; 
     super.setContentView(content); 
    } 

    @Override 
    public void setContentView(View view) { 
     if (view instanceof EditText) { 
      ((EditText) view).addTextChangedListener(mInputObserver); 
     } else if (view instanceof ViewGroup && !mOptimize) { 
      initInputsObservers((ViewGroup) view); 
      mOptimize = false; 
     } 
     super.setContentView(view); 
    } 

    /** 
    * Implement this method to allow your activities to get notified when one 
    * of their {@link EditText} widgets receives input from the user. 
    * 
    * @param s the string that was entered by the user in one of the EditTexts. 
    */ 
    public abstract void onInputChange(String s); 

    /** 
    * This will recursively go through the entire content view and add a 
    * {@link TextWatcher} to every EditText widget found. 
    * 
    * @param root 
    *   the content view 
    */ 
    private void initInputsObservers(ViewGroup root) { 
     final int count = root.getChildCount(); 
     for (int i = 0; i < count; i++) { 
      final View child = root.getChildAt(i); 
      if (child instanceof EditText) { 
       ((EditText) child).addTextChangedListener(mInputObserver); 
      } else if (child instanceof ViewGroup) { 
       initInputsObservers((ViewGroup) child); 
      } 
     } 
    } 

} 

然後你在你的活動做的是落實onInputchange回調,讓你知道,用戶從輸入了什麼東西在EditTexts之一目前的佈局。您可能希望查看活動類中的關鍵事件回調以獲得更簡單的內容,但如果我沒有弄錯,則這些事件將被小組件所使用。

+0

完美!正是我在找什麼。我今天會試一試 – Snake

0

讓你的TextViews都叫addTextChangedListener()給他們你的活動作爲參數(這一點)。讓您的活動執行TextWatcher並覆蓋afterTextChanged()。 每當TextView發生更改時,afterTextChanged()都會被調用。 這裏是你的代碼應該是什麼樣子

public class YouActivity extends Activity implements TextWatcher{ 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
[...] 

textView1.addTextChangedListener(this); 
textView2.addTextChangedListener(this); 
[...] 
} 

@Override 
public void afterTextChanged (Editable s) 
{ 
    //do something 
} 

} 
+0

我一直在尋找一種解決方案,它不涉及我的問題中提到的所有字段監聽器。例如,也許是活動更改的通用聽衆?鍵盤輸入..等等? – Snake

+0

沒有聽衆,你不知道視圖是否改變。 聽着鍵盤?一個選項,但每次按下按鈕時都會收到通知(而不是在TextView中)。是否有你不想使用監聽器的原因? –

+0

您仍然會收到一封關於textWatcher放入edittext的每封信的通知。我不想使用lsitener的原因是因爲我有超過10個活動,每個活動都有edittexts和spinners。我想創建所有這些活動擴展的基本活動,並在該基本活動中「做某件事」,以便在任何底層活動字段發生變化時顯示消息。 – Snake

相關問題