如何在导航架构组件中关闭片段时隐藏键盘

9

我在一个活动中有几个片段。当一些片段关闭时,如果键盘打开,就需要隐藏它。通常通过从活动到片段的链式调用onOptionsItemSelected来完成此操作。

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    when (item.itemId) {
        android.R.id.home -> {
            UiUtil.hideKeyboard(activity)
            return true
        }

        else -> return super.onOptionsItemSelected(item)
    }
}

但是当使用导航架构组件时,它看起来非常糟糕。是否有任何简单的方法可以使用导航架构组件隐藏键盘?


4
管理键盘从来都不是一件容易的事情 ;) - EpicPandaForce
你能否发布一下看起来“不好”的代码和包含导航架构组件使用的代码? - Janos Breuer
你能添加代码吗? - Natig Babayev
2个回答

10

我希望确保每当我们更改目的地时都隐藏键盘。因此,我会做类似这样的事情:

class MainActivity :
        AppCompatActivity(R.layout.activity_main),
        NavController.OnDestinationChangedListener
{

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        findNavController(R.id.mainNavHostFragment).addOnDestinationChangedListener(this)
    }

    override fun onDestroy() {
        super.onDestroy()
        findNavController(R.id.mainNavHostFragment).removeOnDestinationChangedListener(this)
    }

    override fun onDestinationChanged(
            controller: NavController,
            destination: NavDestination,
            arguments: Bundle?
    ) {
        currentFocus?.hideKeyboard()
    }

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

2
真的是一个非常好的解决方案。 - Gnzlt
1
当我们想要允许某个目的地在启动时显示键盘时,问题就出现了。所提出的解决方案将阻止它这样做。我采用了一种肮脏的方法,通过检查目的地标签并仅在特定屏幕上隐藏键盘来解决问题。 - Mieszko Koźma
@MieszkoKoźma 如果你想在特定的目的地显示键盘,那么你可以使用类似这样的代码在 onDestinationChanged() 中检查指定的 id:if (screenIdsWithKeyboardAtStart.contains(destination.id)) showKeyboard() else hideKeyboard() - wrozwad

0

这应该可以工作(我通常在 OnClickListeners 中使用它):

    InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);

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