20 のアクティビティがありEditTexts
ます。何か入力されたらメッセージを表示したい。各フィールドに 20 人のリスナーをアタッチする代わりに、入力が提供されている (データが変更されている) かどうかを知る方法はありますか?
2 に答える
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
ウィジェットによって消費されます。
あなたの 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
}
}