片段中的 getContext()

Posted

技术标签:

【中文标题】片段中的 getContext()【英文标题】:getContext() in Fragment 【发布时间】:2018-07-19 04:42:25 【问题描述】:

我在哪里可以访问Fragment 中的getContext()?我的意思是,它不是 null 并且可以使用(例如,用于创建控件)。是onAttachonCreateView还是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】:

onAttachonDetach 之间使用getActivity() 得到附加的Activity,即FragmentContext

【讨论】:

我想,几乎是一样的。我的意思是 getActivity()getContext() 可能会在片段的生命周期内使用。【参考方案4】:

onCreateView() 中调用getContext() 是非常安全的。如果您查看docs,您会发现从onAttach 开始,您的片段将具有上下文。

【讨论】:

在 onViewCreated() 中,我的项目中的上下文有时可能为空。所以同样的情况也可能发生在 onCreateView() 中。因此,您的假设是错误的。 @oiyio,这很有趣。我读到一些问题,他们真的得到了 context == null。我理解,当片段重新创建时,它可以在活动之前创建。那么,这是否意味着onCreateViewonAttach 之前被调用? 听起来合乎逻辑。 context的原因为null,可能是onAttach之前调用了onCreateView。

以上是关于片段中的 getContext()的主要内容,如果未能解决你的问题,请参考以下文章

Canvas中用jQuery获取到的对象无法使用getContext

Android (安卓) getContext 和 getActivity的区别

关于ActionContext.getContext()的用法

片段中的LayoutInflator错误“不兼容的类型”[重复]

FFmpeg源代码简单分析——sws_getContext()

记一次View.getContext()遇到的大坑