Android自定义类调用hideKeyboard方法遇rootView报错解决方案咨询
在自定义类中获取rootView以隐藏软键盘的解决方案
嘿,作为Android新手遇到这个问题真的很常见,我来帮你一步步捋清楚怎么解决~
首先得明白为什么Fragment里能直接用rootView:Fragment本身会绑定一个专属的视图层级,rootView就是它的根视图。但自定义类没有默认的视图引用,所以我们需要从外部传递必要信息,或者通过合法方式获取视图令牌。
下面给你几个实用的解决方案,按推荐程度排序:
方案1:传递任意可见View(最灵活安全)
其实隐藏软键盘不一定非要rootView,只要是当前界面上可见的View,都能通过它获取窗口令牌(windowToken)。我们可以修改自定义类的方法,让调用者传入一个View参数:
public void hideKeyboard(View targetView) { try { // 从传入的View获取Context Context context = targetView.getContext(); InputMethodManager inputManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); // 用targetView的windowToken来隐藏键盘 inputManager.hideSoftInputFromWindow(targetView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } catch (Exception keyboardHideExp) { Log.d("eEmp/HideKbExp", "Exception raised due to " + keyboardHideExp.toString()); } }
调用场景示例:
- 在Activity里:
yourCustomClass.hideKeyboard(getWindow().getDecorView().getRootView()); - 在Fragment里:
yourCustomClass.hideKeyboard(getView());(getView()就是Fragment的rootView) - 甚至可以直接传当前有焦点的输入框:
yourCustomClass.hideKeyboard(yourEditText);
方案2:通过Activity Context获取根视图
如果你不想传View,可以让调用者传入Activity类型的Context,然后从中提取根视图:
public void hideKeyboard(Context context) { try { // 先判断Context是不是Activity类型,避免类型转换崩溃 if (context instanceof Activity) { Activity activity = (Activity) context; // 获取Activity的根视图 View rootView = activity.getWindow().getDecorView().getRootView(); InputMethodManager inputManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(rootView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } catch (Exception keyboardHideExp) { Log.d("eEmp/HideKbExp", "Exception raised due to " + keyboardHideExp.toString()); } }
⚠️ 注意:一定要加instanceof判断,要是传入的是Application Context,直接强转会崩溃!
方案3:如果自定义类是自定义View
如果你的自定义类本身继承自View(比如自定义Button、自定义Layout),那直接在类里调用getRootView()就能拿到当前界面的根视图了:
private void hideKeyboard() { try { View rootView = this.getRootView(); InputMethodManager inputManager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(rootView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } catch (Exception keyboardHideExp) { Log.d("eEmp/HideKbExp", "Exception raised due to " + keyboardHideExp.toString()); } }
小提示
- 尽量避免持有Activity或View的强引用,防止内存泄漏。如果自定义类是长期存在的,建议用弱引用或者在调用时临时传递参数。
- 如果不确定View是否可见,可以先判断
targetView.isShown(),避免无效调用。
内容的提问来源于stack exchange,提问作者kalyan
相关产品推荐
相关产品推荐

