Android Tips #20 EditText の inputType で日本語が制限できない指定

catch

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

EditText の inputType とは

EditText に入力される文字の種類を限定したいとき、 inputType プロパティを指定することで IME に入力制限をかけることができます。XML で指定することもできますし、 Java から指定することもできます。例えば以下のように電話番号に使われる文字だけ入力させるようにできます。

XML で指定する場合

<EditText
	android:id="@+id/edit_text"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:inputType="phone" />

Java で指定する場合

editText.setInputType(InputType.TYPE_CLASS_PHONE);

実行結果 (POBoxTouchの場合)

日本語やアルファベットなどの文字列をコピペして貼り付けても入力されないので、電話番号に入力できる文字(数字)だけに正しくバリデートできているということがわかります。

inputTypeで日本語が制限できない?

上記例では電話番号で試しましたが、今度はメールアドレスに使われる文字だけ制限してみます。

<EditText
	android:id="@+id/edit_text"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:inputType="textEmailAddress"
	/>

言語タイプ(日本語, アルファベット, 数字)を変更するボタンがあるので、押してみます。

日本語で入力できてしまいました。。これではメールアドレスを使用出来る文字だけにバリデートできていません。
一般的によく使われる IME アプリで inputType のいくつかの指定によって挙動がどうなるか調べてみました。◯が日本語入力を制限できている項目、☓が制限できていない項目です。

IMEアプリ phone textEmailAddress textVisiblePassword datetime date
POBox Touch
(Xperia arc)
×
Google日本語入力 × ×
Shimeji × ×
ATOK
(お試し版)
×
OpenWnn ×
NX!input
(ARROWS X LTE)
×

いくつかのIMEアプリで挙動の差異があることがわかります。正しくバリデートできているものがあれば、できていないIMEアプリもあります。 以上の理由から inputType で日本語はバリデートはできない! と考えたほうが良さそうです。

InputFilter を使用したバリデート

EditText にどうしても制限をかけたい場合は InputFilterクラス を使用すると良いでしょう。InputFilter を使うと、任意の文字以外を入力できないように EditText の入力文字を制限することができます。以下の例では、メールアドレスに使用できる文字だけ入力できるように制限しています。

EditText editText = (EditText) findViewById(R.id.edit_text);
// フィルターを作成
InputFilter inputFilter = new InputFilter() {
	@Override
	public CharSequence filter(CharSequence source, int start, int end,
			Spanned dest, int dstart, int dend) {
		if (source.toString().matches("^[0-9a-zA-Z@¥.¥_¥¥-]+$")) {
			return source;
		} else {
			return "";
		}
	}
};
// フィルターの配列を作成
InputFilter[] filters = new InputFilter[] { inputFilter };
// フィルターの配列をセット
editText.setFilters(filters);

まとめ

inputType は「IME起動時に開く文字種を決めるもの」

今回はいくつかのIMEアプリで inputType の指定によってどのような挙動になるか試しました。ほとんどのIMEアプリでIME起動時に表示される文字種を変えることができているということが分かりました(Google日本語入力は制御できていないですが)。しかし文字種切り替えによって日本語入力ができてしまうので、バリデートができていません。ということで、 inputType は「IME起動時に開く文字種を決めるもの」という認識で使用するようにしたほうが良さそうです。

日本語入力の可否はよく考えて採用すべき

inputType に指定する値によっては日本語入力モードに変更できないということが分かりました(textVisiblePasswordなど)。しかし日本語入力を制限するということは日本語で辞書登録している人には困る仕様になってしまうことも理解が必要です。はじめから日本語できないようにするほうが良いのか?入力は自由にさせておいて、入力確定時にエラーにするほうが良いのか?どちらのほうがユーザビリティ的に、システム的に良いのかよく考えて実装するようにしましょう。

参考