如何在ViewPager页面切换时隐藏软键盘?
解决ViewPager切换Fragment时软键盘未隐藏的问题
我之前也碰到过这个糟心的情况!用户在带EditText的Fragment里唤起软键盘,滑去其他页面后键盘还赖着不走,半遮着屏幕,体验特别差。下面几个亲测有效的方案,你可以挨个试试:
方案一:给ViewPager添加页面切换监听器
当ViewPager切换页面时,直接触发软键盘隐藏操作,这个方法能覆盖所有页面切换的场景,最通用:
Kotlin 代码示例
viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} override fun onPageSelected(position: Int) { // 获取输入法管理器 val imm = requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager // 获取当前获取焦点的View(通常是EditText) val focusedView = requireActivity().currentFocus focusedView?.let { // 隐藏软键盘 imm.hideSoftInputFromWindow(it.windowToken, 0) // 清除焦点,避免切回该页面时键盘自动弹出 it.clearFocus() } } override fun onPageScrollStateChanged(state: Int) {} })
Java 代码示例
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} @Override public void onPageSelected(int position) { InputMethodManager imm = (InputMethodManager) requireContext().getSystemService(Context.INPUT_METHOD_SERVICE); View focusedView = requireActivity().getCurrentFocus(); if (focusedView != null) { imm.hideSoftInputFromWindow(focusedView.getWindowToken(), 0); focusedView.clearFocus(); } } @Override public void onPageScrollStateChanged(int state) {} });
方案二:在目标Fragment的生命周期方法中处理
如果只有某个带EditText的Fragment需要处理,可以在它的onPause()方法里隐藏键盘——因为切换Fragment时,原Fragment会执行onPause():
override fun onPause() { super.onPause() val imm = requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager val focusedView = requireActivity().currentFocus focusedView?.let { imm.hideSoftInputFromWindow(it.windowToken, 0) it.clearFocus() } }
方案三:兜底方案(针对currentFocus为空的情况)
有时候currentFocus可能为空(比如用户点击EditText后快速滑动),这时候可以直接用Activity的DecorView来触发隐藏:
val imm = requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.hideSoftInputFromWindow(requireActivity().window.decorView.windowToken, 0)
把这段代码替换方案一或二中的隐藏逻辑就行,确保无论焦点状态如何,都能尝试收起键盘。
额外检查项
如果以上方法都无效,你可以检查下Activity的windowSoftInputMode配置,避免因为系统键盘行为设置导致异常:
在AndroidManifest.xml中你的Activity标签里,确保配置没有冲突:
<activity android:name=".YourMainActivity" android:windowSoftInputMode="stateHidden|adjustResize"> <!-- 其他配置 --> </activity>
内容的提问来源于stack exchange,提问作者Ening
相关产品推荐
相关产品推荐

