You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:58:28