fragment、FragmentContainerView、NavHostFragment、用户 Fragment 之间的关系

  1. fragment 的 name 属性用于在布局文件中静态声明一个 Fragment(指定该 Fragment 的具体实现类)

  2. androidx.fragment.app.FragmentContainerViewfragment 是容器,androidx.fragment.app.FragmentContainerViewfragment 的增强版

  3. androidx.navigation.fragment.NavHostFragment 是一个有特殊导航功能的 Fragment,通常被放在前两者里面

  4. 层级关系:FragmentContainerView -> NavHostFragment -> 用户 Fragment


Fragment 中隐藏软键盘

1、具体实现
private void hideSoftKeyboard() {
    InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    if (inputMethodManager != null)
        inputMethodManager.hideSoftInputFromWindow(getView().getWindowToken(), 0);
}
2、解读
(1)获取 InputMethodManager 实例
InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
getActivity 是 Fragment 的方法,返回该 Fragment 所属的宿主 Activity

在 Fragment 生命周期中,只有onAttach 方法执行后到 onDetach 方法执行前,getActivity 方法才不返回 null

现代 Android 开发推荐使用 requireActivity 方法,它会在 Activity 为 null 时抛出明确异常而非返回 null
getSystemService 是 Activity 的方法,用于获取系统服务

参数 `Context.INPUT_METHOD_SERVICE` 是常量字符串 `"input_method"`,标识输入法服务

返回的是 Object 类型,需要强制转换为 InputMethodManager
InputMethodManager 是 Android 系统中管理输入法(IME)的核心类

负责软键盘的显示、隐藏和各种交互

是系统级单例服务,不能直接实例化,必须通过 getSystemService 获取
(2)空安全检查
if (inputMethodManager != null)
系统服务理论上不应该为 null,但良好的编程习惯应该做防御性检查

如果系统处于异常状态或权限问题可能导致获取服务失败

在 Android 8.0(API 26)及以上版本,getSystemService 方法基本不会返回 null
(3)隐藏软键盘
inputMethodManager.hideSoftInputFromWindow(getView().getWindowToken(), 0);
getView 是 Fragment 的方法,返回该 Fragment 的根视图

只有在 onCreateView 方法执行后才会非 null

现代开发推荐使用 requireView 方法替代,它会在视图为 null 时抛出明确异常
getWindowToken 是 View 的方法,返回该视图关联的窗口令牌(WindowToken)

WindowToken 是系统用于识别窗口的唯一标识

软键盘总是关联到某个窗口,需要这个令牌来确定操作哪个窗口的键盘
hideSoftInputFromWindow 方法参数详解

第 1 个参数:窗口令牌,告诉系统要隐藏哪个窗口的软键盘

第 2 个参数:隐藏标志,通常为 0 或以下常量:

    0:默认方式

    InputMethodManager.HIDE_IMPLICIT_ONLY:只隐藏自动弹出的软键盘

    InputMethodManager.HIDE_NOT_ALWAYS:非强制隐藏,系统可能拒绝
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐