キーボードを非表示にするには、次のものを実装する必要があることは誰もが知っています。
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
EditText
しかし、ここで重要なのは、ユーザーがソフトキーボード以外の場所をタッチまたは選択したときに、キーボードを非表示にする方法です。
onTouchEvent()
親で を使用しようとしましたActivity
が、ユーザーが他のビューの外側をタッチし、スクロールビューがない場合にのみ機能します。
タッチ、クリック、フォーカス リスナーを実装しようとしましたが、成功しませんでした。
タッチ イベントをインターセプトするために独自のスクロール ビューを実装しようとしましたが、イベントの座標しか取得できず、クリックされたビューは取得できませんでした。
これを行う標準的な方法はありますか? iPhone では本当に簡単でした。
ベストアンサー1
次のスニペットは単にキーボードを非表示にします。
public static void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager =
(InputMethodManager) activity.getSystemService(
Activity.INPUT_METHOD_SERVICE);
if(inputMethodManager.isAcceptingText()){
inputMethodManager.hideSoftInputFromWindow(
activity.getCurrentFocus().getWindowToken(),
0
);
}
}
これをユーティリティ クラスに配置するか、アクティビティ内で定義する場合は、アクティビティ パラメータを回避するか、 を呼び出しますhideSoftKeyboard(this)
。
最も難しいのは、いつ呼び出すかです。View
アクティビティ内のすべてのメソッドを記述して、それが であるかどうかを確認し、そうでない場合はそのコンポーネントにinstanceof EditText
を登録すればsetOnTouchListener
、すべてがうまくいきます。その方法がわからない場合は、実際には非常に簡単です。次のように再帰メソッドを記述します。実際、これを使用して、カスタム書体のセットアップなど、何でも実行できます。メソッドは次のとおりです。
public void setupUI(View view) {
// Set up touch listener for non-text box views to hide keyboard.
if (!(view instanceof EditText)) {
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
hideSoftKeyboard(MyActivity.this);
return false;
}
});
}
//If a layout container, iterate over children and seed recursion.
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
View innerView = ((ViewGroup) view).getChildAt(i);
setupUI(innerView);
}
}
}
これですべてです。setContentView
アクティビティでこのメソッドを呼び出すだけです。どのパラメータを渡すのか疑問に思うかもしれませんが、これは親コンテナの です。次のように親コンテナに をid
割り当てます。id
<RelativeLayoutPanel android:id="@+id/parent"> ... </RelativeLayout>
そして電話するsetupUI(findViewById(R.id.parent))
、それだけです。
これを効果的に使用したい場合は、拡張を作成しActivity
てこのメソッドを配置し、アプリケーション内の他のすべてのアクティビティがこのアクティビティを拡張してメソッドsetupUI()
内で呼び出すようにしますonCreate()
。
1つ以上のアクティビティを使用する場合は、親レイアウトに共通のIDを定義します。<RelativeLayout android:id="@+id/main_parent"> ... </RelativeLayout>
次に、クラスを拡張してそのクラス内でActivity
定義し、``Activity''の代わりにこのクラスを拡張します。setupUI(findViewById(R.id.main_parent))
OnResume()
in your program
上記の関数の Kotlin バージョンは次のとおりです。
@file:JvmName("KeyboardUtils")
fun Activity.hideSoftKeyboard() {
currentFocus?.let {
val inputMethodManager = ContextCompat.getSystemService(this, InputMethodManager::class.java)!!
inputMethodManager.hideSoftInputFromWindow(it.windowToken, 0)
}
}