生命周期感知型Fragment中的碎片生命周期事件

21

我有一个生命周期感知的碎片和一个 LifecycleObserver

        public class MyFragment extends Fragment {
            @Override
            public void onCreate(@Nullable Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                new MyObserver(this);

            }

            @Nullable
            @Override
            public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
                return inflater.inflate(R.layout.activity_main, container, false);
            }
        }

以下是我的观察者类,它记录所有片段事件的属性。

        public class MyObserver implements LifecycleObserver {
            private static final String TAG = "MyObserver";
            public MyObserver(LifecycleOwner lifecycleOwner) {
                lifecycleOwner.getLifecycle().addObserver(this);
            }

            @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
            public void onCreate(){
                Log.d(TAG, "onCreate: ");
            }

            @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
            public void onPause(){
                Log.d(TAG, "onPause: ");
            }

            @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
            public void onDestroy(){
                Log.d(TAG, "onDestroy: ");
            }

            @OnLifecycleEvent(Lifecycle.Event.ON_START)
            public void onStart(){
                Log.d(TAG, "onStart: ");
            }

        }

我希望能够监听特定于片段的生命周期事件,例如onDestroyViewonActivityCreated,但这些事件在 Lifecycle.Event中不存在。

Lifecycle.Event仅包含活动事件。我该如何在我的观察者中监听片段事件?


1
你能找到关于这个的任何信息吗? - Sujan Shrestha
我也在尝试弄清楚这个问题。你找到解决方案了吗? - portfoliobuilder
使用生命周期观察器来实现这个有什么方法吗?下面的答案可以通过编写自定义方法并从片段中调用来实现,而不需要使用生命周期观察器。 - abhishek maharajpet
4个回答

16

您可以观察片段的viewLifecycleOwner生命周期。

viewLifecycleOwner.lifecycle.addObserver(yourObserverHere)

然后,该片段的onDestroyView生命周期方法与@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)注释方法相关联。

请注意,在onCreateViewonDestroyView生命周期方法之间,片段的viewLifecycleOwner仅可用。


1
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) 在片段被销毁时调用,而不是在 destroyview 中。 - Shalan93
6
这要看是哪个生命周期,是片段生命周期还是片段视图的生命周期。 - Basim Alamuddin
1
需要澄清 - Shalan93
@Shalan93 请阅读有关 getViewLifecycleOwner() 方法的内容,你就会理解它。 - Basim Alamuddin
@Shalan93,请查看我的回答以获取有关 ON_DESTROY 的更多详细信息。 - Weiyi

1

对Basim Alamuddin的回答进行补充:

从资源代码中可以看出,在将观察者添加到viewLifecycleOwner时,也会调用@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY):viewLifecycleOwner.lifecycle.addObserver(this)

// androidx.fragment.app.Fragment

void performDestroyView() {
    if (mView != null) {
        mViewLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
    }
    onDestroyView();

void performDestroy() {
    mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
    onDestroy();

-5

根据thisonDestroyView会在onStop之后被调用。所以,如果你需要在onDestroyView之前运行逻辑或者检测它,我认为最好在fragment的onStop()方法中调用或检测它。在你的情况下,我认为你需要实现Lifecycle.Event.ON_STOPLifecycle.Event.ON_START来处理onActivityCreated

希望能对你有所帮助。


https://developer.android.com/guide/fragments/lifecycle - M. Reza Nasirloo

-6

片段生命周期

onCreateView()

被调用以创建与片段相关联的视图层次结构。

onDestroyView()

当与片段相关联的视图层次结构正在被移除时调用。


我的问题是关于架构组件的。 - user4260260

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