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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值