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

问题描述 投票:17回答:9

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

有一个流行的问题Close/hide the Android Soft Keyboard关于在Java中这样做,但据我所知,应该有一个替代版本的Kotlin。我该怎么办?

android android-softkeyboard kotlin
9个回答
34
投票

我想我们可以稍微提高Viktor的答案。基于它始终附加到视图,将有上下文,如果有上下文,则有InputMethodManager

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

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


24
投票

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

(*)最新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()

6
投票

只需在您的活动中覆盖此方法即可。它将自动在其子片段中工作.....

在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);
}

在科特林

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)
    }

投票如果它适合你....谢谢......


4
投票

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);
}

2
投票

您可以使用Anko使生活更轻松,因此该行将是:

inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)

或者更好的创建扩展功能:

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

并称之为:

view?.hideKeyboard(activity.inputMethodManager)

2
投票

我在这里找到了适合我的答案: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)

1
投票

这适用于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
投票

创建一个名为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 )

0
投票

您可以使用下面的代码,我在我的片段中写下以下代码:

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.