用键盘打开片段

时间:2019-11-25 12:10:42

标签: android kotlin

在顶部有一个带有edittext的片段

当我打开该片段时,键盘应自动打开

要实现这一点,我将在片段的onStart()方法上显示键盘并将其隐藏在onStop()方法上。

问题是我第一次打开片段时KeyBoard正在显示,如果我返回并再次打开该片段,它将不显示KeyBoard

fun hideKeyboard() {
        val view = this.currentFocus
        if (view != null) {
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm.hideSoftInputFromWindow(view.windowToken, 0)
        }
    }

fun showKeyBoard() {
        val view = this.currentFocus
        if (view != null) {
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm.toggleSoftInputFromWindow(view.windowToken, InputMethodManager.SHOW_FORCED, 0)
        }
}

2 个答案:

答案 0 :(得分:2)

我建议您通过请求键盘的视图,并使用扩展功能对其进行改编

fun AppCompatActivity.hideKeyboard(view: View?) {
    view?.let {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, 0)
    }
}

fun AppCompatActivity.showKeyBoard(view: View?) {
    view?.let  {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.toggleSoftInputFromWindow(view.windowToken, InputMethodManager.SHOW_FORCED, 0)
    }
}

这是一个可行的解决方案,但我真的不知道为什么当前的Focus无法正常工作。如果我找出原因,我稍后会再次编辑。

编辑1:

我遇到了真正的问题。

使用toggleSoftInputFromWindow启动键盘时, IMM 会保存来自窗口的参考。因此,如果您requestFocus(),则IMM会理解该窗口内的视图已被聚焦,因此当您再次使用toggleSoftInputFromWindow()进行请求时,由于“您的视图已被聚焦”,因此IMM将不会显示键盘。即使销毁片段时调用clearFocus也会发生此问题。要解决此问题,您可以使用toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)打开键盘而没有任何窗口。

fun AppCompatActivity.showKeyBoard(view: View?) {
    view?.let  {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
    }
}

现在的流程是:

打开您的片段->告诉您的编辑文本获得焦点->使用这种新方式打开键盘

关闭片段->以正常方式关闭键盘->开心

答案 1 :(得分:0)

您必须在onStart()中请求聚焦于edittext。 我将发布Java代码,它对我有用。

editText.requestFocus();