0

addChangeTextListenerを使用しようとしていますが、キーをクリックすると画面がフリーズします。コードは次のとおりです。

email = (EditText) findViewById(R.id.email);


    email.addTextChangedListener(new TextWatcher() 
    { 
        @Override
        public void afterTextChanged(Editable s) 
        { 
            if (email.getText().toString().matches("[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+") 
                    && s.length() > 0)
                error.setText("valid email");
            else
               email.setText("invalid email");              
        }
        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1,int arg2, int arg3) 
        {   
        }
        @Override
        public void onTextChanged(CharSequence arg0, int arg1,int arg2, int arg3) 
        {                   
        } 
    });
4

3 に答える 3

2
email.setText("invalid email");

上記の行は次のようになります。

error.setText("invalid email");

を使用するsetText()と、再度トリガーafterTextChanged()されます。

于 2012-12-20T01:10:58.437 に答える
1

elseステートメントにタイプミスがあります。電子メールではなく、エラー時にsetTextを呼び出したい。

于 2012-12-20T01:10:55.293 に答える
1

変更リスナー内にテキストを設定すると、変更リスナーが再度呼び出されるため、無限ループが発生します。

のAndroidドキュメントからTextWatcher.afterTextChanged()

このメソッドは、s内のどこかでテキストが変更されたことを通知するために呼び出されます。このコールバックからsにさらに変更を加えることは正当ですが、変更を加えるとこのメソッドが再帰的に再度呼び出されるため、無限ループに陥らないように注意してください。(他のafterTextChanged()メソッドがすでに他の変更を行い、オフセットを無効にしている可能性があるため、変更がどこで行われたかはわかりません。ただし、ここで知る必要がある場合は、onTextChangedでsetSpan(Object、int、int、int)を使用できます。 (CharSequence、int、int、int)あなたの場所をマークし、スパンが終わったここから見上げます。

error.setText()の代わりに電話するつもりはなかったことを確認してくださいemail.setText()

于 2012-12-20T01:11:02.070 に答える