0

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

4

2 回答 2

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小部件消耗的。

于 2012-10-03T15:45:55.870 回答
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
}

}
于 2012-10-03T13:59:22.660 回答