如何从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
相关产品推荐
相关产品推荐

