需求场景:
FragmentActivity上显示DialogFragment,当关闭FragmentActivity的时候,如果DialogFragment有控件获得焦点并且键盘弹出,希望可以关掉键盘。
网上最多的办法:
InputMethodManager manager = (InputMethodManager) actv.getSystemService(Context.INPUT_METHOD_SERVICE);
manager.hideSoftInputFromWindow(actv.getCurrentFocus().getWindowToken(), 0);
因为获得焦点的控件在DialogFragment上,FragmentActivity上没有任何控件获取焦点,所以使用上面方法的时候,会发现抛出了空指针,因为actv.getCurrentFocus()的时候返回了null。
但是如果获取焦点的控件在FragmentActivity上,而不是在DialogFragment上,则上述方法成立。
可以采用如下方法:
@Override
public void onPause() {
hideSoftInput(((ViewGroup) getView()).getFocusedChild());
super.onPause();
}
void hideSoftInput(View view) {
if (getActivity() == null || view == null) {
return;
}
int times = 0;
boolean isClosed = false;
InputMethodManager manager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
while (!isClosed && times <= 5) {
times++;
isClosed = manager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
可以通过((ViewGroup) getView()).getFocusedChild()这种方法获取DialogFragment的焦点控件,然后调用hideSoftInputFromWindow,为什么这里用了while循环,是担心怕一次关不掉(每次关键盘总觉得好多坑,就多关闭几次),这里还需要设置次数,不能超过五次,免得死循环,导致不能执行后面的语句。