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?