克隆片段时如何使用Navigation Architecture组件隐藏键盘

时间:2019-01-15 15:42:05

标签: android android-fragments android-architecture-components

我在一个活动中托管了几个片段。当某些片段关闭时,有必要隐藏键盘(如果打开),通常通过将onOptionsItemSelected从活动链接到片段来完成

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

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

但是,当使用导航体系结构组件时,它看起来确实很糟糕。 有什么简单的方法可以隐藏带有Navigation Architecture Component的键盘吗?

2 个答案:

答案 0 :(得分:4)

我想确保每次更改目的地时都隐藏键盘。所以我做这样的事情:

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

答案 1 :(得分:0)

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

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