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) として与えます。アクティビティに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 に答える