您的位置:首页 > 其它

Fragment.getActivity().getCurrentFocus = null解决办法

2016-05-24 17:55 260 查看
需求场景:

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循环,是担心怕一次关不掉(每次关键盘总觉得好多坑,就多关闭几次),这里还需要设置次数,不能超过五次,免得死循环,导致不能执行后面的语句。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  fragment 获取焦点