web-dev-qa-db-ja.com

LifeCycleAwareフラグメントのフラグメントライフサイクルイベント

ライフサイクル対応のフラグメントと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);
            }
        }

以下は、すべてのフラグメントイベントを適切にログに記録する私のObserverクラスです。

        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。アクティビティイベントのみが含まれます。オブザーバーでフラグメントイベントをリッスンするにはどうすればよいですか

9
user4260260

フラグメントのviewLifecycleOwnerライフサイクルを観察できます。

_viewLifecycleOwner.lifecycle.addObserver(yourObserverHere)
_

次に、フラグメントのonDestroyViewlifecyleメソッドが@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)アノテーション付きメソッドに関連付けられます。

フラグメントのviewLifecycleOwnerは、onCreateViewメソッドとonDestroyViewライフサイクルメソッドの間でのみ使用可能であることに注意してください。

2
Basim Alamuddin

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();
0
li2