AndroidFragment onAttach()已弃用

我已经更新了我的应用程序以使用最新的支持库(版本23.0.0),我发现他们弃用了Fragment类的onAttach()函数。

代替:

onAttach (Activity activity) 

下雪了:

 onAttach (Context context) 

由于我的应用程序使用通过弃用之前通过的活动,我认为一个可能的解决scheme是:

 @Override public void onAttach(Context context) { super.onAttach(context); activity = getActivity(); } 

那会是正确的做法吗?

更新:

如果我运行API低于23的设备,新的onAttach()甚至不被称为。 我希望这不是他们打算做的!

更新2:

问题已经解决与SDK的最新更新。

我已经在我的API 22设备上进行了testing,onAttach(Context)正在被调用。

点击这里查看几星期前我已经打开的错误报告以及Google的家伙的答案。

活动是一个上下文,所以如果你可以简单地检查上下文是一个活动,并在必要时进行转换。

 @Override public void onAttach(Context context) { super.onAttach(context); Activity a; if (context instanceof Activity){ a=(Activity) context; } } 

更新:有人声称新的Context覆盖从未被调用。 我做了一些testing,找不到这种情况,根据源代码,它永远不会是真的。 在我testing的所有情况下,在SDK23之前和之后,onAttach的ActivityContext版本都被调用。 如果您发现情况并非如此,我build议您创build一个示例项目来说明问题并将其报告给Android团队 。

更新2:我只使用Android支持库碎片,因为错误得到修复更快。 似乎上面的问题覆盖不能被正确调用,只有在使用框架片段时才会出现。

如果使用框架片段,并且设备的SDK版本低于23, OnAttach(Context context)不会调用OnAttach(Context context)

我使用支持片段,所以废弃是固定的, onAttach(Context context)总是被调用。

这是另一个来自谷歌的巨大变化…build议的修改: onAttach(Activity activity)replaceonAttach(Context context)在较旧的API崩溃我的应用程序,因为onAttach(Context context)将不会在本地片段上调用。

我正在使用本机片段(android.app.Fragment),所以我不得不做以下工作,再次在旧的API(<23)上工作。

这是我做的:

 @Override public void onAttach(Context context) { super.onAttach(context); // Code here } @SuppressWarnings("deprecation") @Override public void onAttach(Activity activity) { super.onAttach(activity); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { // Code here } } 

目前来自onAttach Fragment代码,不清楚Context是否是当前活动: Source Code

 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(); } 

所以,如果你想确定你正在获取Activity,那么使用getActivity() (在你的Fragment onAttach中),但是不要忘了检查null因为如果mHostnull你的activity将是null

 @Override public void onAttach(Context context) { super.onAttach(context); Activity activity = context instanceof Activity ? (Activity) context : null; } 

使用sdkpipe理器下载最新的支持库并包含

 compile 'com.android.support:appcompat-v7:23.1.1' 

在gradle.app中,并将编译版本设置为api 23

下面的答案与Android开发者网站的Fragments教程中发生的弃用警告有关,可能与上述post无关。

我在教程课上使用了这段代码,它确实起作用了。

 public void onAttach(Context context){ super.onAttach(context); Activity activity = getActivity(); 

我担心这个活动可能是空的,正如文档所述。

getActivity

FragmentActivity getActivity()返回此片段当前与之关联的FragmentActivity。 如果片段与Context相关联,则可能会返回null。

但main_activity上的onCreate清楚地显示了片段被加载,所以在这个方法之后,从片段调用get activity将返回main_activity类。

getSupportFragmentManager()。beginTransaction().add(R.id.fragment_container,firstFragment).commit();

我希望我对此是正确的。 我是一个绝对的新手。

你可能使用android.support.v4.app.Fragment 。 为此而不是onAttach方法,只需使用getActivity()来获取片段所关联的FragmentActivity 。 否则你可以使用onAttach(Context context)方法。