如何解决ViewPager内Fragment隐藏软键盘时华为Mate20 Pro返回view为null问题
全机型兼容的Fragment内隐藏软键盘方案
问题根因
部分国产ROM(包括华为EMUI、小米MIUI等)在ViewPager切换Fragment的过程中,会主动清除当前页面的焦点,导致getActivity().getCurrentFocus()返回null,原有逻辑无法拿到WindowToken执行隐藏操作。
兼容修改方案
不要依赖当前焦点View获取WindowToken,改为使用Fragment根布局/Activity顶层DecorView的WindowToken,兜底逻辑补充软键盘服务非空校验,兼容代码如下:
// 先获取输入法服务实例,空校验避免崩溃 InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); if (imm == null) { return; } // 优先拿Fragment自身根布局的WindowToken,只要Fragment完成布局就不会为null View fragmentRoot = getView(); if (fragmentRoot != null) { imm.hideSoftInputFromWindow(fragmentRoot.getWindowToken(), 0); return; } // 兜底逻辑:拿Activity顶层DecorView的Token,绝对不会为空 View decorView = getActivity().getWindow().getDecorView(); imm.hideSoftInputFromWindow(decorView.getWindowToken(), 0);
特殊场景适配
如果是在ViewPager的onPageSelected切换回调里执行隐藏逻辑,部分机型因为切换动画未完成会出现隐藏失效的问题,可以加100~200ms的延迟执行:
new Handler(Looper.getMainLooper()).postDelayed(() -> { // 上述隐藏软键盘逻辑放在此处执行 }, 150);
内容的提问来源于stack exchange,提问作者Nao Kreuzeder
相关产品推荐
相关产品推荐

