【发布时间】:2018-07-19 04:42:25
【问题描述】:
我在哪里可以访问Fragment 中的getContext()?我的意思是,它不是 null 并且可以使用(例如,用于创建控件)。是onAttach、onCreateView还是onActivityCreated?
【问题讨论】:
标签: android android-fragments android-context
我在哪里可以访问Fragment 中的getContext()?我的意思是,它不是 null 并且可以使用(例如,用于创建控件)。是onAttach、onCreateView还是onActivityCreated?
【问题讨论】:
标签: android android-fragments android-context
所有提到的答案基本上都是正确的。您应该在 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 块中使用。
【讨论】:
isAdded() 来判断一个片段是否还存在。但是,如果我们仅依赖上下文,您的变体会更好。
requireContext() 和requireActivity() 是强制性的,而不是getContext() 和getActivity()。根据 StackOverflow 中的其他主题,您的答案更正确,因为在 onCreate() 或 onCreateView() 中存在 getContext() == null 的情况。
getContext() 在onAttach() 和onDetach() 之间始终不为空
【讨论】:
在onAttach 和onDetach 之间使用getActivity() 得到附加的Activity,即Fragment 的Context。
【讨论】:
getActivity() 或 getContext() 可能会在片段的生命周期内使用。
在onCreateView() 中调用getContext() 是非常安全的。如果您查看docs,您会发现从onAttach 开始,您的片段将具有上下文。
【讨论】:
onCreateView 在onAttach 之前被调用?