2012-10-03 20 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

相关问题