サンプルプログラム工場

AAKAKA Appで使われているプログラムのサンプルコードをそのまま公開!

サンプルプログラム工場 > android > AndroidのEditTextの数値の制限(範囲を限定)をTextWatcherを使ってするサンプル#tryAndroidTextwatcherExtend00
Google Play AAKAKAxSOFTへ

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

実行ファイル(APK)やサンプル(zip)をダウンロードする
tryAndroidTextwatcherExtend00の実行イメージ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);
	}

}
サンプルプロジェクトをダウンロード APKファイルをダウンロード

, , , , ,

Androidのエミュレーターにアプリ(apkファイル)のインストール/アンインス... AndroidでXMLファイルからオプションメニューを作るサンプル#tryOptionMenu00

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>