如何知道用户是否在没有字段侦听器的情况下进行输入?

时间:2012-10-03 13:31:39

标签: android android-edittext

我有一个20 EditTexts的活动。如果输入了任何内容,我想显示一条消息。有没有办法知道输入是否已被提供(数据已更改)?而不是将20个侦听器附加到每个字段?

2 个答案:

答案 0 :(得分: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之一中输入了某些内容。您可能希望查看活动类中的关键事件回调以获得更简单的内容,但如果我没有弄错,那些事件将由TextView / EditText小部件使用。

答案 1 :(得分:0)

让TextViews全部调用addTextChangedListener(),将他们的Activity作为参数(this)。让您的Activity实现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
}

}