使用Kotlin关闭/隐藏Android软键盘

Close/hide the Android Soft Keyboard with Kotlin

我正在尝试在Kotlin中编写一个简单的Android应用程序。我的布局中有一个edittext和一个按钮。在编辑字段中写入内容并单击按钮后,我想隐藏虚拟键盘。

有一个流行的问题关闭/隐藏Android软键盘关于Java的操作,但据我所知,应该有一个替代版本的Kotlin。我该怎么做?


我想我们可以稍微改进一下维克多的回答。基于它始终附加到视图,将有上下文,如果有上下文,则有inputMethodManager

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

在这种情况下,上下文自动表示视图的上下文。你怎么认为?


在活动、片段中使用以下实用程序功能隐藏软键盘。

(*)最新Kotlin版本的更新

1
2
3
4
5
6
7
8
9
10
11
12
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)
}

老回答:

1
2
3
4
5
6
7
8
9
10
11
12
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)
}

这将关闭键盘,不管您的代码是在对话框片段和/或活动等。

活动/片段中的用法:

1
hideKeyboard()


彼得的解决方案通过扩展视图类的功能巧妙地解决了这个问题。另一种方法可能是扩展活动类的功能,从而将隐藏键盘的操作绑定到视图的容器,而不是视图本身。

1
2
3
4
fun Activity.hideKeyboard() {
    val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(findViewById(android.R.id.content).getWindowToken(), 0);
}

只需在活动中重写此方法。它也将自动在其子片段中工作…

用Java语言

1
2
3
4
5
6
7
8
@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);
}

在Kotlin

1
2
3
4
5
6
7
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)
    }

如果它对你有用的话就投票吧….谢谢。。。。。


你可以用安科来让生活更轻松,所以这条线是:

1
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)

或者最好创建扩展函数:

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

这样称呼它:

1
view?.hideKeyboard(activity.inputMethodManager)


生成名为utils的对象类:

1
2
3
4
5
6
7
8
9
10
11
12
13
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()
        }

    }
}

您可以在任何想要隐藏软输入键盘的类中使用此方法。我在我的电脑里用这个。

这里的视图是您在布局中使用的任何视图:

1
Utils.hideSoftKeyBoard(this@BaseActivity, view )


我在这里找到了适合我的答案:http://programminget.blogspot.com/2017/08/how-to-close-android-soft-keyboard.html

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

这与API 26很好地配合使用。

1
2
3
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
2
3
private val myLayout = ViewTreeObserver.OnGlobalLayoutListener {
    yourTextView.isCursorVisible = KeyboardTool.isSoftKeyboardShown(myRelativeLayout.rootView)
}

然后在fragmentonViewCreated中:

1
2
3
4
......
super.onViewCreated(view, savedInstanceState)
myRelativeLayout.viewTreeObserver.addOnGlobalLayoutListener(myLayout)
......

onDestroyView中也使用:

1
2
3
4
override fun onDestroyView() {
    super.onDestroyView()
 myRelativeLayout.viewTreeObserver.removeOnGlobalLayoutListener(myLayout)
}

还有:

1
2
3
4
5
6
7
8
9
10
11
12
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
    }
}