
AndroidのEditTextの数値の制限(範囲を限定)をTextWatcherを使ってするサンプル#tryAndroidTextwatcherExtend00


EditTextで入力された文字をTextWatcherを使って制限する。
先頭に0が並んでしまう問題を解決する。
InputFilterをつかうと1文字単位での入力制限ができるけど、その一文字以前に入力されている文字列を変更することができない。
そうすると、0~100までの数値を入力しようとしたときに0を入力すると消せなくなってしまう。(tryAndroidEditTextInputFilter00のやり方だと)
000は0と判定されてしまうし、001でも1なので見た目上へんてこな数値になってしまう。
例えば100以上の数値を入力した場合強制的に100にしたいとか0以下の値は強制的に0とかそういう使い方ができるようにしたい。
大事なところ
EditTextのsetTextを呼んだ場合でもonTextChangedは呼ばれてしまうので無視するようにする。
TextWatcherへの呼び出しをActivityに戻すようにTextWatcherを拡張してある。
関連項目
TextWatcher
mSkipOnTextChangedTrig
addTextChangedListener
開発環境
Eclipse IDE バージョン: 3.7 Indigo Service Release 1
ターゲットプラットフォーム: 2.1
API レベル: 7
package trial.sample.tryandroidtextwatcherextend00; import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; public class TryAndroidTextwatcherExtend00Activity extends Activity implements ITextWatcherCallback { // このフラグがたってる間はonTextChangedは処理されない boolean mSkipOnTextChangedTrig; // 値を入力するEditText EditText mEditText; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // TextWatcherをセットするEditText this.mEditText = (EditText)this.findViewById(R.id.editText1); this.mEditText.addTextChangedListener(new TextWatcherExtend(R.id.editText1, this)); } //////////////////////////////////////////////////////////// // String内の値をInt型として取り出す、取り出しに失敗した場合は // defaultValueの値が戻る private int getIntValue(String text, int defaultValue) { int ret = 0; // EditText内の値を取り出す try { ret = Integer.valueOf(text); } catch (Exception e) { return defaultValue; } return ret; } //////////////////////////////////////////////////////////// // ここから下はITextWatcherCallback public void afterTextChanged(int editTextId, Editable s) { // TODO 自動生成されたメソッド・スタブ } public void beforeTextChanged(int editTextId, CharSequence s, int start, int count, int after) { // TODO 自動生成されたメソッド・スタブ } //////////////////////////////////////////////////////////// // テキストが変更されたときに呼ばれる public void onTextChanged(int editTextId, CharSequence s, int start, int before, int count) { // EditText内の文字列に変更を加える(setTextを使った変更でも)と必ず // onTextChangedが呼び出されるのでonTextChanged内での変更に関しては // スキップフラグを立てて処理を無視するようにする if (this.mSkipOnTextChangedTrig == true) { this.mSkipOnTextChangedTrig = false; return; } // EditTextを取り出す final EditText editText = (EditText)this.findViewById(editTextId); // 先頭の0の処理 // String editTextValue = editText.getText().toString(); boolean modValue = false; // 2文字以上で1文字目に0が入っている場合 if (2 <= editTextValue.length()) { // 先頭に0が入ってる if (editTextValue.charAt(0) == '0'){ editTextValue = editTextValue.substring(1); modValue = true; } } // エディットテキスト内の数値を取り出す int value = this.getIntValue(editTextValue, -1); // 正しい入力ではない、叉は0以下 if (value == -1 || value < 0) { this.mSkipOnTextChangedTrig = true; editText.setText("0"); editText.setSelection(1); // フォーカスを一番後ろへ移動する // 100以上の数値が入っていた } else if (100 < value) { this.mSkipOnTextChangedTrig = true; editText.setText("100"); editText.setSelection(3); // フォーカスを一番後ろへ移動する // 先頭に0が入っていたりして内容を変更する必要がある場合 } else if (modValue == true) { this.mSkipOnTextChangedTrig = true; editText.setText(editTextValue); editText.setSelection(editTextValue.length()); // フォーカスを一番後ろへ移動する } } } //////////////////////////////////////////////////////////// //どのボタンが押されたか識別できるようにしたTextWatcherから //呼び出されるもの interface ITextWatcherCallback { public void afterTextChanged(int editTextId, Editable s); public void beforeTextChanged(int editTextId, CharSequence s, int start, int count, int after); public void onTextChanged(int editTextId, CharSequence s, int start, int before, int count); } //////////////////////////////////////////////////////////// //EditText監視の拡張 class TextWatcherExtend implements TextWatcher { final int mEditTextId; final ITextWatcherCallback mCallback; //////////////////////////////////////////////////////////// // コンストラクタ public TextWatcherExtend(final int editTextId, final ITextWatcherCallback callback) { this.mEditTextId = editTextId; this.mCallback = callback; } //////////////////////////////////////////////////////////// // テキスト変更後 public void afterTextChanged(Editable s) { this.mCallback.afterTextChanged(this.mEditTextId, s); } //////////////////////////////////////////////////////////// // テキスト変更前 public void beforeTextChanged(CharSequence s, int start, int count, int after) { this.mCallback.beforeTextChanged(this.mEditTextId, s, start, count, after); } //////////////////////////////////////////////////////////// // テキスト変更後 public void onTextChanged(CharSequence s, int start, int before, int count) { this.mCallback.onTextChanged(this.mEditTextId, s, start, before, count); } }
Androidのエミュレーターにアプリ(apkファイル)のインストール/アンインス... AndroidでXMLファイルからオプションメニューを作るサンプル#tryOptionMenu00