You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从FragmentManager获取Context?扩展函数需访问SharedPreferences

当然有办法啦!既然你的loadFragment是FragmentManager?的扩展函数,我们可以利用FragmentManager和Activity/Fragment的绑定关系来拿到Context,给你几个实用的方案:

方案一:直接从FragmentManager关联的Activity获取

FragmentManager本质上是和某个Activity绑定的——不管它是来自Activity的supportFragmentManager,还是Fragment的childFragmentManager/parentFragmentManager,都能通过它的activity属性拿到关联的Activity(也就是Context的实现类)。记得做好空安全处理:

inline fun FragmentManager?.loadFragment(...) {
    // 空安全判断:如果FragmentManager为null,或者关联的Activity已销毁,直接返回
    val context = this?.activity ?: return
    
    // 现在可以用context获取SharedPreferences了
    val sharedPrefs = context.getSharedPreferences("your_pref_name", Context.MODE_PRIVATE)
    
    // 你的Fragment加载逻辑继续...
}

小提示:如果担心持有Activity引用导致内存泄漏,可以改用context.applicationContext来获取全局的Application Context。

方案二:通过主导航Fragment获取Context

如果你的项目用了导航组件(Navigation Component),或者FragmentManager是用于页面导航的,可以通过primaryNavigationFragment拿到当前导航栈里的主Fragment,再从这个Fragment获取Context,这种方式更贴近当前活跃的页面场景:

inline fun FragmentManager?.loadFragment(...) {
    // 拿到当前主导航Fragment,再获取它的Context
    val context = this?.primaryNavigationFragment?.requireContext() ?: return
    
    val sharedPrefs = context.getSharedPreferences("your_pref_name", Context.MODE_PRIVATE)
    
    // 你的Fragment加载逻辑继续...
}

这里的requireContext()会在Fragment没有绑定Context时抛出异常,如果想更稳妥,可以换成context并做空判断:this?.primaryNavigationFragment?.context ?: return。

注意要点

  • 因为你的扩展函数接收的是FragmentManager?,必须做好空安全处理,避免空指针异常。
  • 如果Fragment对应的Activity已经销毁,或者Fragment已被 detach,Context可能会是null,这时候要根据你的业务逻辑决定是直接终止流程还是做降级处理。

内容的提问来源于stack exchange,提问作者Azizur Rehman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:13:27