サイト移転のお知らせ:http://techbooster.org/に移転しました

ソフトキーボードを非表示にする

8月 5, 2011   //   by kseto   //   ユーザインターフェース  //  No Comments

EditTextにテキストを入力しようとするとソフトキーボードが表示されますが、
EditTextのフォーカスが外れてもソフトキーボードが非表示にならずに、次の操作の邪魔になってしまう場合があります。

今回はEditTextのフォーカスが外れたときにソフトキーボードを非表示にする方法についてご紹介したいと思います。

詳細は続きからどうぞ。

フォーカスの状態変化を検知する

まず、EditTextのフォーカスが外れたことを検知するための仕組みが必要になります。
これにはonFocusChangedコールバックメソッドを利用します。
onFocusChangedコールバックメソッドはEditTextなどのビューがフォーカスされた、
あるいはフォーカスが外れたのをトリガーに呼び出されるメソッドです。

void onFocusChange(View v, boolean hasFocus)

引数のvにはフォーカス状態が変化したView、hasFocusにはフォーカスの状態が格納されます。
hasFocusを見ればフォーカスの状態を判別できますので、フォーカスが外れたときに目的の処理を行えば良いことになります。

EditText et = (EditText) findViewById(R.id.editText1);
et.setOnFocusChangeListener(new View.OnFocusChangeListener() {
	@Override
	public void onFocusChange(View v, boolean hasFocus) {
		// EditTextのフォーカスが外れた場合
		if (hasFocus == false) {
			// 処理を行う
		}
	}
});

ソフトキーボードを非表示にする

ソフトキーボードを非表示にするにはInputMethodManagerを取得して、
hideSoftInputFromWindowメソッドを呼び出します。

boolean hideSoftInputFromWindow(IBinder windowToken, int flags)

引数にはwindowTokenにウィンドウの識別子、flagsにソフトキーボードの非表示設定フラグを指定します。
flagsに指定できる値は以下の2つがあります。

・HIDE_IMPLICIT_ONLY : 予測変換表示のみ非表示にして、ソフトキーボード自体は表示したままにする
・HIDE_NOT_ALWAYS : 予測変換表示もソフトキーボードも非表示にする

今回のケースではソフトキーボードを完全に非表示にしたいので、HIDE_NOT_ALWAYSを指定します。

サンプル

サンプルではEditTextからButtonにフォーカスが移ったときに、ソフトキーボードを非表示にさせています。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
	
    button = (Button) findViewById(R.id.button1);
    button.setOnClickListener(this);

    et = (EditText) findViewById(R.id.editText1);
    et.setOnFocusChangeListener(new View.OnFocusChangeListener() {
		
		@Override
		public void onFocusChange(View v, boolean hasFocus) {
			// EditTextのフォーカスが外れた場合
			if (hasFocus == false) {
				// ソフトキーボードを非表示にする
				InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
				imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
			}
		}
	});
}

@Override
public void onClick(View v) {
	// ボタンにフォーカスを移動させる
	button.setFocusable(true);
	button.setFocusableInTouchMode(true);
	button.requestFocus();
}

関連する記事:

Sponsored Link

Comments are closed.

技術書新刊 発売中

アンドロイドアカデミアには、CIやテスト、互換検証など実務に生きるノウハウをあつめています

技術書新刊 発売中

Android Next!はAndroid 7.0に対応したはじめての技術書です!


The Web Explorer 2はCSSの中央寄せやWebAudioなど未来を読み解く一冊です


Revised TypeScript in DefinitelylandはTypeScript 2.0(β)に対応した解説書です。インストールから型定義まで幅広くサポートしています


技術書をかこう!はエンジニアらしい執筆環境を構築、HowTo本です