2

デバッグセッション中に、奇妙なことが起こっているのを見つけました。ユーザーが入力しているときに検証を実行するようにEditText現在のアクティビティを定義したコントロールがあります。OnKeyListener

コード

txtPhoneNumber.setOnEditorActionListener(this);
txtPhoneNumber.setOnKeyListener(this);
txtPhoneNumber.setOnFocusChangeListener(this);

@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    String phoneNumber = ((TextView) v).getText().toString();
    if (phoneNumber != null && !"".equals(phoneNumber))
        setValidPhoneNumber(checkValidPhoneNumber(phoneNumber));

    setForwardButtonEnabled(this.validPhoneNumber && this.readyToGo);

    if (actionId == EditorInfo.IME_ACTION_DONE) {
        InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        in.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }

    return false;
}

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {

    String phoneNumber = ((TextView) v).getText().toString();
    if (phoneNumber != null && !"".equals(phoneNumber))
        setValidPhoneNumber(checkValidPhoneNumber(phoneNumber));

    setForwardButtonEnabled(this.validPhoneNumber && this.readyToGo);

    return false;
}

OKこれは、ユーザーがEnterキーを押したときに、ソフトキーボードを閉じるだけでなく、検証を再度実行するのに非常に冗長であることを認めることができます。ただし、OnKeyイベントが2回ディスパッチされていることがわかりました。

たとえば、私は書いて3551234567いて、すでに入力しました355。1を押すと、1つのイベントがv.getText()=で発生355し、次の別のイベントがv.getText()=で発生し3551ます。

これが正常であるかどうか、およびこれが「preOnKeyEvent」であるか「postOnKeyEvent」であるかを区別することで回避できるかどうかを知りたいです。文字列はイベントの前ではなく、イベントのにのみ必要です。

ありがとうございました

4

2 に答える 2

5

キーダウンイベントとキーアップイベントの両方が発生している可能性があります。

KeyEventのアクションでACTION_UPアクションを確認して、メソッドをフィルタリングしてみてください。

詳細については、これをお読みください

于 2012-03-25T21:39:11.260 に答える
2

キーダウンとキーアップのイベントが発生します。キーイベントの代わりにテキスト変更イベントをリッスンする方が良い

txtPhoneNumber.addTextChangedListener(new TextWatcher() {

    public void onTextChanged(CharSequence s, ....){
        //validation
    }
 });
于 2012-03-25T21:42:47.497 に答える