如何在Kotlin中隐藏SearchView的软键盘?

3

我在我的工具栏中有一个SearchView,在设置中用户可以启用或禁用虚拟键盘,因为他可能使用带物理键盘的设备。

对于普通的EditText,我使用以下代码来禁用软键盘:

if (!keyboard) {
    txtBarcode.showSoftInputOnFocus = false
    txtQta.showSoftInputOnFocus = false
}else {
    txtBarcode.showSoftInputOnFocus = true
    txtQta.showSoftInputOnFocus = true
}

尝试使用同样的代码来处理SearchView时,它并不能工作。因此我在stackoverflow上找到了一个函数来尝试解决问题,但即使这样也不能正常工作。以下是我尝试过的内容:

override fun onPrepareOptionsMenu(menu: Menu) {
    super.onPrepareOptionsMenu(menu)
    val item: MenuItem = menu.findItem(R.id.app_bar_search)
    val searchView: SearchView = item.actionView as SearchView

    val prefs = PreferenceManager.getDefaultSharedPreferences(requireContext())
    val keyboard = prefs.getBoolean("keyboard", true)
    inputModeChange(searchView, keyboard);
    item.isVisible = true

}

private fun inputModeChange(editText:SearchView, showKeyboard:Boolean) {
    editText.postDelayed({
        if (showKeyboard) {
            val keyboard = requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            keyboard.showSoftInput(editText, 0)
        } else if (!showKeyboard) {
            val imm = requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm.hideSoftInputFromWindow(editText.windowToken, 0)
        }
    }, 50)
}

但是这并没有产生任何影响,那么我如何以编程的方式禁用SearchView的虚拟键盘?


我已经仔细查看了源代码,可以基本保证没有一种干净的方法来完成这个任务,我猜想您不希望使用反射等解决方案? - Henry Twist
1个回答

4
您希望完全禁用用户设置中的软键盘。请尝试使用我的解决方案,以完全禁用软输入键盘:
window.setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
                            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)

当然,您可以始终返回并使用以下方法触发软输入键盘:

window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)

如果您感兴趣,可以在这里了解有关此标志的信息。


1
这会仅在设置标志的活动中禁用键盘吗? - NiceToMytyuk
@IgorMytyuk 是的,我们将标志添加到活动窗口属性中。 - Rondev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接