我已经更新了我的应用程序使用最新的支持库(版本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(上下文)正在被调用。

点击这里查看我几周前打开的漏洞报告,以及谷歌的人给出的答案。


当前回答

虽然似乎在大多数情况下,有onAttach(Context)就足够了,但有一些电话(如:小米Redme Note 2)没有被调用,因此它会导致nullpointerexception。所以为了安全起见,我建议也不要使用被弃用的方法:

// onAttach(Activity) is necessary in some Xiaomi phones
@SuppressWarnings("deprecation")
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    _onAttach(activity);
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    _onAttach(context);
}

private void _onAttach(Context context) {
    // do your real stuff here
}

其他回答

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    Activity activity = context instanceof Activity ? (Activity) context : null;
}

这是谷歌的另一个巨大变化…建议的修改:用onAttach(Context Context)替换onAttach(Activity Activity)在旧的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
    }
}

你可能正在使用android.support.v4.app.Fragment。对于这个方法,而不是onAttach方法,只需使用getActivity()来获取片段关联的FragmentActivity。否则你可以使用onAttach(Context Context)方法。

虽然似乎在大多数情况下,有onAttach(Context)就足够了,但有一些电话(如:小米Redme Note 2)没有被调用,因此它会导致nullpointerexception。所以为了安全起见,我建议也不要使用被弃用的方法:

// onAttach(Activity) is necessary in some Xiaomi phones
@SuppressWarnings("deprecation")
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    _onAttach(activity);
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    _onAttach(context);
}

private void _onAttach(Context context) {
    // do your real stuff here
}

下载最新的支持库与sdk管理器和包括

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

在它。App并设置编译版本为API 23