1. ホーム
  2. android

[解決済み] 編集テキストをクリックした後、ソフトキーボードを隠すには?

2022-03-25 21:06:30

質問

キーボードを隠すには実装が必要なのは誰でも知っていることです。

InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

しかし、ここで重要なのは、ユーザが EditText またはソフトキーボードを使用しますか?

を使おうとしたのですが onTouchEvent() を親にして Activity が、これはユーザーが他のビューの外側をタッチし、スクロールビューがない場合にのみ機能します。

タッチ、クリック、フォーカスのリスナーを実装しようとしましたが、成功しませんでした。

タッチイベントをインターセプトするために独自のスクロールビューを実装しようとしましたが、イベントの座標を取得するだけで、クリックされたビューを取得することはできません。

標準的な方法はありますか?iPhoneではとても簡単でした。

解決方法は?

以下のスニペットは、単にキーボードを非表示にするものです。

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() メソッドを使用します。

お役に立てれば幸いです。

複数のアクティビティを使用する場合は、次のように親レイアウトに共通のIDを定義します。 <RelativeLayout android:id="@+id/main_parent"> ... </RelativeLayout>

そして 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)
    }
}