如何最佳实践地引用片段的父活动?

14

我最近一直在使用碎片,并且好奇如何最好地使用对碎片的父活动的引用。是继续调用getActivity()更好,还是在onActivityCreated回调中初始化parentActivity变量?

3个回答

22

这实际上包含在Android官方文档中的Fragments部分。 当你需要父活动的上下文(例如Toast,Dialog)时,你会调用getActivity()。 当您需要调用Fragment界面中的回调方法时,应使用在onAttach(...)中实例化的回调变量。

public static class FragmentA extends ListFragment {
    ExampleFragmentCallbackInterface mListener;
    ...
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {
            mListener = (ExampleFragmentCallbackInterface ) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + " must implement ExampleFragmentCallbackInterface ");
        }
    }
    ...
}

源代码


使用FragmentCallbackInterface是我实现此功能的首选方式。 - Yen NQ
@James:你能解释一下为什么这种方法比使用getActivity()更好吗?有时getActivity()会返回null,导致应用程序崩溃。通过使用上述方法,可以确保应用程序不会崩溃吗?谢谢。 - Rajat
1
如果 getActivity() 返回 null,则表示您尚未附加,因此 mListener 也将为 null。与使用 getActivity() 相比,这种方法更好,因为它确保您附加到的任何活动都实现了与片段中的内容一起使用所需的接口。 - James McCracken
onAttach(Activity activity)在API 23中已被弃用,因此这个链接不再有效http://developer.android.com/reference/android/app/Fragment.html#onAttach(android.app.Activity) - CrimsonX

9

使用getActivity()是最好的选择。您无需维护一个变量来存储它(总是,直到应用程序生命周期结束!)。如果需要,调用该方法并使用即可!:)


1
当活动被重新创建时(例如从设置更改权限),getActivity()会返回null。 - hkaraoglu

-1
如果您在从某个活动调用的片段中,想要获取对父活动的引用,可以在片段的onViewCreated()或后续钩子方法中直接调用它,只需确保父活动不为null即可。
getActivity()

如果你想确保,你需要先进行检查。

if (getActivity() != null){ // then your logic with getActivity()}

1
有人能解释一下为什么这个答案被踩得这么多吗?这里有什么不好的做法吗? - dsalaj
我也不确定。 - dave o grady

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接