我已经更新了我的应用程序使用最新的支持库(版本23.0.0),我发现他们弃用了Fragment类的onAttach()函数。
而不是:
onAttach (Activity activity)
现在是:
onAttach (Context context)
由于我的应用程序使用的活动传递之前弃用,我认为一个可能的解决方案是:
@Override
public void onAttach(Context context) {
super.onAttach(context);
activity = getActivity();
}
这是正确的做法吗?
更新:
如果我运行一个API低于23的设备,新的onAttach()甚至没有被调用。我希望这不是他们的本意!
更新2:
该问题已解决与SDK的最新更新。
我已经测试了我的API 22设备和onAttach(上下文)正在被调用。
点击这里查看我几周前打开的漏洞报告,以及谷歌的人给出的答案。
Activity是一个上下文,所以如果你可以简单地检查上下文是否是一个Activity,并在必要时强制转换它。
@Override
public void onAttach(Context context) {
super.onAttach(context);
Activity a;
if (context instanceof Activity){
a=(Activity) context;
}
}
更新:一些人声称新的Context重写永远不会被调用。我做了一些测试,找不到一个场景,这是真的,根据源代码,它不应该是真的。在我测试的所有情况下,无论是SDK23之前还是之后,onAttach的Activity和Context版本都被调用了。如果你能找到一个不是这样的场景,我建议你创建一个示例项目来说明这个问题,并将其报告给Android团队。
更新2:我只使用Android支持库片段,因为那里的bug修复得更快。似乎只有当你使用框架片段时,上面的覆盖没有被正确调用的问题才会显现出来。
Activity是一个上下文,所以如果你可以简单地检查上下文是否是一个Activity,并在必要时强制转换它。
@Override
public void onAttach(Context context) {
super.onAttach(context);
Activity a;
if (context instanceof Activity){
a=(Activity) context;
}
}
更新:一些人声称新的Context重写永远不会被调用。我做了一些测试,找不到一个场景,这是真的,根据源代码,它不应该是真的。在我测试的所有情况下,无论是SDK23之前还是之后,onAttach的Activity和Context版本都被调用了。如果你能找到一个不是这样的场景,我建议你创建一个示例项目来说明这个问题,并将其报告给Android团队。
更新2:我只使用Android支持库片段,因为那里的bug修复得更快。似乎只有当你使用框架片段时,上面的覆盖没有被正确调用的问题才会显现出来。
目前从onAttach片段代码,它不清楚是否上下文是当前的活动:源代码
public void onAttach(Context context) {
mCalled = true;
final Activity hostActivity = mHost == null ? null : mHost.getActivity();
if (hostActivity != null) {
mCalled = false;
onAttach(hostActivity);
}
}
如果查看getActivity,您将看到相同的调用
/**
* Return the Activity this fragment is currently associated with.
*/
final public Activity getActivity() {
return mHost == null ? null : mHost.getActivity();
}
因此,如果你想确保你正在获得的活动,然后使用getActivity()(在onAttach在你的片段),但不要忘记检查null,因为如果mHost为空,你的活动将为空