片段中的 getContext()
Posted
技术标签:
【中文标题】片段中的 getContext()【英文标题】:getContext() in Fragment 【发布时间】:2018-07-19 04:42:25 【问题描述】:我在哪里可以访问Fragment
中的getContext()
?我的意思是,它不是 null 并且可以使用(例如,用于创建控件)。是onAttach
、onCreateView
还是onActivityCreated
?
【问题讨论】:
【参考方案1】:所有提到的答案基本上都是正确的。您应该在 onAttach 和 onDetach 之间获得活动的上下文,所以我喜欢将其添加到我的片段中:
private Context mContext;
@Override
public void onAttach(Context context)
super.onAttach(context);
mContext = context;
@Override
public void onDetach()
super.onDetach();
mContext = null;
然后每当我使用 mContext 时,我都会添加一个检查:
if(mContext != null)
//your code that uses Context
更新:
在支持库 27.1.0 及更高版本中,Google 引入了新方法 requireContext() 和 requireActivity(),它们将返回非 null Context 或 Activty。
如果在调用方法时 Fragment 当前未附加,它将抛出 IllegalStateException: 所以在 try catch 块中使用。
【讨论】:
是否存在 mContext 为 null 且片段仍然存在的情况?或者你的意思是当片段分离时有一个长时间运行的操作结束? 是的,如果片段中有一个带有回调的长时间运行的操作,并且您刚刚单击了一个切换片段的按钮,那么您的片段不再附加到您的活动。 同意,这个变种是可能的。 我认为,我们可以使用isAdded()
来判断一个片段是否还存在。但是,如果我们仅依赖上下文,您的变体会更好。
目前requireContext()
和requireActivity()
是强制性的,而不是getContext()
和getActivity()
。根据 *** 中的其他主题,您的答案更正确,因为在 onCreate()
或 onCreateView()
中存在 getContext() == null
的情况。【参考方案2】:
getContext()
在onAttach()
和onDetach()
之间始终不为空
【讨论】:
【参考方案3】:在onAttach
和onDetach
之间使用getActivity()
得到附加的Activity
,即Fragment
的Context
。
【讨论】:
我想,几乎是一样的。我的意思是getActivity()
或 getContext()
可能会在片段的生命周期内使用。【参考方案4】:
在onCreateView()
中调用getContext()
是非常安全的。如果您查看docs,您会发现从onAttach
开始,您的片段将具有上下文。
【讨论】:
在 onViewCreated() 中,我的项目中的上下文有时可能为空。所以同样的情况也可能发生在 onCreateView() 中。因此,您的假设是错误的。 @oiyio,这很有趣。我读到一些问题,他们真的得到了 context == null。我理解,当片段重新创建时,它可以在活动之前创建。那么,这是否意味着onCreateView
在onAttach
之前被调用?
听起来合乎逻辑。 context的原因为null,可能是onAttach之前调用了onCreateView。以上是关于片段中的 getContext()的主要内容,如果未能解决你的问题,请参考以下文章
Canvas中用jQuery获取到的对象无法使用getContext
Android (安卓) getContext 和 getActivity的区别
关于ActionContext.getContext()的用法
片段中的LayoutInflator错误“不兼容的类型”[重复]