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

来源:互联网 发布:内蒙古大数据局 编辑:程序博客网 时间:2024/06/05 07:08

需求场景:
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上,则上述方法成立。

可以采用如下方法:

@Overridepublic 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循环,是担心怕一次关不掉(每次关键盘总觉得好多坑,就多关闭几次),这里还需要设置次数,不能超过五次,免得死循环,导致不能执行后面的语句。

0 0
原创粉丝点击