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的Activity和Context版本都被调用。 如果您发现情况并非如此,我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因为如果mHost为null你的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)方法。 
- 警报pipe理器示例
- 使用Maps API v2以编程方式初始化MapFragment
- 无法将Eclipse ADT更新到22
- Android:如何获得modal dialog或类似的模态行为?
- javax.net.ssl.SSLException:读取错误:ssl = 0x9524b800:系统调用期间发生I / O错误,由对等方重置连接
- 如何让onItemSelected从一个新实例化的Spinner上触发?
- 如何为AutoCompleteTextView创build自定义BaseAdapter
- 如何查看保存在android数据库(SQLite)的数据?
- 如果我尝试启动服务,为什么会得到InstantiationException?