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循環,是擔心怕一次關不掉(每次關鍵盤總覺得好多坑,就多關閉幾次),這裏還需要設置次數,不能超過五次,免得死循環,導致不能執行後面的語句。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章