web-dev-qa-db-ja.com

Kotlinを使用したAndroidソフトキーボードを閉じる/隠す

Kotlinで簡単なAndroidアプリを作成しようとしています。レイアウトにEditTextとButtonがあります。編集フィールドに書き込み、Buttonをクリックした後、仮想キーボード。

人気の質問があります閉じる/隠すAndroidソフトキーボード Javaですが、私が理解している限り、Kotlinの代替バージョンがあるはずです。

31
Eugene Trifonov

Viktorの回答を少し改善できると思います。常にビューにアタッチされていることに基づいて、コンテキストがあります。コンテキストがある場合はInputMethodManagerがあります

fun View.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(windowToken, 0)
}

この場合、コンテキストは自動的にビューのコンテキストを意味します。どう思いますか?

37
Péter Szűcs

アクティビティ、フラグメント内で次のユーティリティ機能を使用して、ソフトキーボードを非表示にします。

(*)最新のKotlinバージョンの更新

fun Fragment.hideKeyboard() {
    view?.let { activity?.hideKeyboard(it) }
}

fun Activity.hideKeyboard() {
    hideKeyboard(if (currentFocus == null) View(this) else currentFocus)
}

fun Context.hideKeyboard(view: View) {
    val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}

古い答え:

fun Fragment.hideKeyboard() {
    activity.hideKeyboard(view)
}

fun Activity.hideKeyboard() {
    hideKeyboard(if (currentFocus == null) View(this) else currentFocus)
}

fun Context.hideKeyboard(view: View) {
    val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}

これにより、ダイアログフラグメントやアクティビティなどのコードに関係なくキーボードが閉じられます。

アクティビティ/フラグメントの使用法:

hideKeyboard()
32
Gunhan

アクティビティでこのメソッドをオーバーライドするだけです。子フラグメントでも自動的に機能します.....

Javaの場合

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (getCurrentFocus() != null) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
    return super.dispatchTouchEvent(ev);
}

In Kotlin

override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        if (currentFocus != null) {
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm.hideSoftInputFromWindow(currentFocus!!.windowToken, 0)
        }
        return super.dispatchTouchEvent(ev)
    }

それがあなたのために働くなら投票してください....ありがとう.....

6
Zeeshan Ayaz

Peterのソリューションは、Viewクラスの機能を拡張することで問題をきれいに解決します。別の方法として、Activityクラスの機能を拡張し、キーボード自体を非表示にする操作を、View自体ではなくViewのコンテナにバインドする方法があります。

fun Activity.hideKeyboard() {
    val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(findViewById(Android.R.id.content).getWindowToken(), 0);
}
5
michal.z

Utilsという名前のオブジェクトクラスを作成します。

object Utils {

    fun hideSoftKeyBoard(context: Context, view: View) {
        try {
            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm?.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
        } catch (e: Exception) {
            // TODO: handle exception
            e.printStackTrace()
        }

    }
}

このメソッドは、ソフト入力キーボードを非表示にする任意のクラスで使用できます。 BaseActivityでこれを使用しています。

ここで、ビューは、レイアウトで使用するビューです。

Utils.hideSoftKeyBoard(this@BaseActivity, view )
3
Paulami Biswas

ここで私のために働いた答えを見つけました: http://programminget.blogspot.com/2017/08/how-to-close-Android-soft-keyboard.html

val inputManager:InputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputManager.hideSoftInputFromWindow(currentFocus.windowToken, InputMethodManager.SHOW_FORCED)
2
Scooter

Ankoを使用して生活を楽にすることができるので、次のようになります。

inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)

または、拡張機能を作成することをお勧めします。

fun View.hideKeyboard(inputMethodManager: InputMethodManager) {
    inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

次のように呼び出します:

view?.hideKeyboard(activity.inputMethodManager)
2
Viktor Yakunin

これはAPI 26でうまく機能します。

val view: View = if (currentFocus == null) View(this) else currentFocus
val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
1
Kavin Varnan

以下のコードから使用できます。次のフラグメントに以下のコードを記述します。

private val myLayout = ViewTreeObserver.OnGlobalLayoutListener {
    yourTextView.isCursorVisible = KeyboardTool.isSoftKeyboardShown(myRelativeLayout.rootView)
}

次に、onViewCreatedfragmentで:

......
super.onViewCreated(view, savedInstanceState)
myRelativeLayout.viewTreeObserver.addOnGlobalLayoutListener(myLayout)
......

onDestroyViewでも使用:

override fun onDestroyView() {
    super.onDestroyView()
 myRelativeLayout.viewTreeObserver.removeOnGlobalLayoutListener(myLayout)
}

そして:

object KeyboardTool {
    fun isSoftKeyboardShown(rootView: View): Boolean {
        val softKeyboardHeight = 100
        val rect = Rect()

        rootView.getWindowVisibleDisplayFrame(rect)

        val dm = rootView.resources.displayMetrics
        val heightDiff = rootView.bottom - rect.bottom
        return heightDiff > softKeyboardHeight * dm.density
    }
}
0
jo jo

Kotlin for Fragmentでの私のソリューションを次に示します。ボタンのsetOnClickListener内に配置します。

val imm = context?.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager?
imm!!.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
0
Georgy Ivanov

アクティビティまたはフラグメントで、次のような関数を作成します。

fun View.hideKeyboard() {
 val inputManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
      inputManager.hideSoftInputFromWindow(windowToken, 0)
}

このアクティビティまたはフラグメントに関連するXMLファイルにyour_button_idというIDを持つボタンがあるとします。そのため、ボタンクリックイベントで:

    your_button_id.setOnClickListener{
       it.hideKeyboard()
     }
0
Seddiq Sorush