2012-12-28 2 views
6

私はTextWatcherでEditTextを持っています。テキストを人間の身長(5'9 ")のようにフォーマットすることになっていますが、ユーザがミスをして誤った文字を削除したい場合、TextWatherはそれを許可しません。 TextWatherはすぐにその背中を追加します。以下はコードです。では、EditTextでテキストを削除する方法を教えてください。TextWatcherでEditTextのテキストを削除するにはどうすればよいですか?文字列を検出してフォーマットするたびに

private class CustomTextWatcher implements TextWatcher { 
    private EditText mEditText; 

public CustomTextWatcher(EditText e) { 
    mEditText = e; 
} 

public void beforeTextChanged(CharSequence s, int start, int count, 
     int after) { 
} 

public void onTextChanged(CharSequence s, int start, int before, 
     int count) { 


} 

public void afterTextChanged(Editable s) { 
    int count = s.length(); 
    String str = s.toString(); 
    if (count == 1) { 
     str = str + "'"; 
    } else if (count == 3) { 
     str = str + "\""; 
    } else if ((count > 4) && (str.charAt(str.length() - 1) != '\"')) { 
     str = str.substring(0, str.length() - 2) 
       + str.charAt(str.length() - 1) + "\""; 
    } else { 
     return; 
    } 
    mEditText.setText(str); 
    mEditText.setSelection(mEditText.getText().length()); 


} 

}

答えて

8

をからくりが間違ったコールバックにいるあなたのコードについて投稿事実を無視して、ここから、あなたはあなただけのユーザーが使用してどのようなキーに耳を傾ける簡単な修正を加えることができます。

任意の実際のテストや既存のコードへの更なる改善がなければ、これはあなたのような問題を解決するように見えるん:

package com.example.testwatchertest; 

import android.app.Activity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.View.OnKeyListener; 
import android.widget.EditText; 

public class MainActivity extends Activity implements TextWatcher { 

    EditText editText; 
    boolean keyDel = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     editText = (EditText) findViewById(R.id.editText); 
     editText.addTextChangedListener(this); 

     editText.setOnKeyListener(new OnKeyListener() { 

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

       if (keyCode == KeyEvent.KEYCODE_DEL){ 
        keyDel = true; 
       }else{ 
        keyDel = false; 
       } 
       return false; 
      } 
     }); 

    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 

     if (!keyDel) { 

      String str = s.toString(); 
      if (count == 1) { 
       str = str + "'"; 
      } else if (count == 3) { 
       str = str + "\""; 
      } else if ((count > 4) && (str.charAt(str.length() - 1) != '\"')) { 
       str = str.substring(0, str.length() - 2) + str.charAt(str.length() - 1) + "\""; 
      } else { 
       return; 
      } 
      editText.setText(str); 
      editText.setSelection(editText.getText().length()); 

     } 

    } 

} 
+0

ありがとうStefan。問題を修正しました。コードをafterTextChanged()メソッドに移動し、キーステータスを確認するためにブール値を使用しました。出来た。ありがとうございました。 –

+0

何らかの理由で、ユーザーが間違いを修正した後にユーザーが入力しようとすると、TextWatcherが機能しません。 –

+1

OnKeyListenerはSamsung Galaxyでは動作しませんが、Motorola Xoomでは正常に動作します –

2

From the docs

パブリック抽象ボイドが(のCharSequence S、int型開始、int型の前に、int型のカウントが)

この方法は、ユーザーに通知するために呼び出されonTextChanged s内で、開始時に開始された の文字は、 以前の長さ。このコールバックを からsに変更しようとするとエラーが発生します。

afterTextChanged()では変更を加え、他の2つのコールバックでは変更しないでください。

パブリック抽象無効(編集可能なS)

をafterTextChangedこのメソッドはどこか秒以内に、テキストが が変更されている、ことを通知するために呼び出されます。この コールバックからさらに変更を加えることは正当ですが、変更を加えると を再帰的に呼び出すため、無限ループに入ることに気をつけてください。 ( の他の メソッドがすでに変更されてオフセットが無効になっている可能性があるため、変更箇所がわからない場合は setSpan(Object, int, int, int)onTextChanged(CharSequence, int, int, int)に設定して、スパン が終わったところ。)

+0

私はafterTextChanged()メソッドにコードを移動し、それが任意の違いはありませんでした。私は自分の投稿を更新しました。ありがとう。 –

関連する問題