【问题标题】:Best practice to reference the parent activity of a fragment?引用片段的父活动的最佳实践?
【发布时间】:2012-10-29 05:03:02
【问题描述】:

我最近一直在处理 Fragment,我只是好奇使用对 Fragment 的父 Activity 的引用的最佳做法是什么。是继续调用 getActivity() 还是在 onActivityCreated 回调上初始化 parentActivity 变量会更好。

【问题讨论】:

    标签: android


    【解决方案1】:

    如果您在从某个活动调用的片段中,要获取对父活动的引用,您可以在 onViewCreated() 或片段的后续钩子方法中直接调用它,这只是为了确保父活动是不为空

    getActivity()
    

    如果你真的想确定你需要先检查

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

    【讨论】:

    • 有人能解释为什么这个答案被如此否决吗?这里有什么不好的做法?
    • 我也不确定
    【解决方案2】:

    这实际上包含在 Fragments 的 Android 官方文档中。当您需要父活动的上下文(例如 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 ");
            }
        }
        ...
    }
    

    Source

    【讨论】:

    • 使用 FragmentCallbackInterface 是我首选的实现方式。
    • @James:你能解释一下为什么这种方法比使用 getActivity() 更好吗?有时 getActivity() 返回 null 并且应用程序崩溃。通过使用上述方法,可以确定应用程序不会崩溃吗?谢谢。
    • 如果 getActivity() 返回 null 那么你还没有被附加,所以 mListener 也将为 null。这种方法比使用getActivity() 更好,因为它确保您附加到的任何活动都实现了处理片段中的内容所需的接口。
    • onAttach(Activity activity) 现在在 API 23 中已弃用,因此这不再有效 developer.android.com/reference/android/app/…
    【解决方案3】:

    getActivity() 是最好的。您无需维护要存储的变量(始终,直到应用程序循环!)。如果需要,调用该方法并使用! :)

    【讨论】:

    • getActivity() 在重新创建活动时返回 null。(例如权限更改设置。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2019-12-17
    • 1970-01-01
    相关资源
    最近更新 更多