在Fragment中隐藏键盘

8

当我试图在活动的片段中隐藏键盘时,出现以下错误:

错误:无法解析getSystemService

无法解析Context

无法解析getCurrentFocus()

 InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
 inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
 InputMethodManager.HIDE_NOT_ALWAYS);
2个回答

16

在片段中,您应该使用getActivity()方法,

        InputMethodManager inputManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(),
            InputMethodManager.HIDE_NOT_ALWAYS);

解决了,它运行得很好。Firass - Lalit Jadiya
通常建议检查getActivity()是否返回null。特别是方向更改可能会导致getActivity()短暂地返回null,因为方向更改会在片段保持不变的同时销毁和重新创建活动。在这种情况下的常见方法是,片段“请求”(例如,通过事件总线)其活动执行需要活动的操作(无法直接在片段中调用getSystemService())。请参阅https://hackernoon.com/8-ways-to-communicate-between-fragment-and-activity-in-android-apps-235b60005d04。 - hBrent

0
说实话,我从来没有在片段中成功关闭过键盘。我不理解它背后的工程原理,但是这里是有效的方法。
MainActivity-
public void closeKeyboard() {
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }
}

碎片

private void closeKeyboard() {
    MainActivity mainActivity = (MainActivity) getActivity();
    mainActivity.closeKeyboard();

}

然后在Fragment中的任何位置调用您的方法closeKeyboard()即可


MainActivity 中的 closeKeyboard() 代码放到片段的 closeKeyboard() 中,但在倒数第二行的 getSystemService 前面加上 getActivity()(即 InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);)。这样就不需要在 MainActivity 中使用 closeKeyboard()。如果这种方法不起作用或有其他原因不能这样做,请解释。 - hBrent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接