web-dev-qa-db-ja.com

onActivityCreatedは非推奨です。LifecycleObserverを適切に使用するにはどうすればよいですか?

GoogleはAndroid)でフラグメントのonActivityCreated()を廃止し、LifeCycleObserverの使用を推奨しています:

 To get a callback specifically when a Fragment activity's
     * {@link Activity#onCreate(Bundle)} is called, register a
     * {@link androidx.lifecycle.LifecycleObserver} on the Activity's
     * {@link Lifecycle} in {@link #onAttach(Context)}, removing it when it receives the
     * {@link Lifecycle.State#CREATED} callback.

だから私は推奨される方法でそれを作ろうとしますが、Logcatで観察できる状態のみがState:INITIALIZEDです。

 private lateinit var lifecycleObserver: LifecycleObserver

 override fun onAttach(context: Context) {
    super.onAttach(context)

    hostActivity = context as HostActivity

    lifecycleObserver = object : LifecycleObserver {

        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
        fun onCreate() {
            Logger.tag("SOME-TAG")d("State: ${lifecycle.currentState}")

            if(lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)) {
                Logger.tag("SOME-TAG").d("CREATED")
                hostActivity.lifecycle.removeObserver(lifecycleObserver)
            }
        }
    }

    hostActivity.lifecycle.addObserver(lifecycleObserver)
}

上記のコードの何が問題になっていますか?

PDATE 1:hostActivity.lifecycle.currentStateを使用するのを忘れたようで、アクティビティのライフサイクルではなくフラグメントのライフサイクルを確認しました。

PDATE 2:1つのホストアクティビティと2つのフラグメントの間で[戻る]ボタンをクリックしたときに、1つのホストアクティビティと2つのフラグメントに対して機能しないGoogleのアプローチにより、onAttachは呼び出されず、onActivityCreatedが呼び出されます。

5
Sever

私は次の方法でそれをしました:

class MyActivityObserver(
    private val update: () -> Unit
) : DefaultLifecycleObserver {

    override fun onCreate(owner: LifecycleOwner) {
        super.onCreate(owner)
        owner.lifecycle.removeObserver(this)
        update()
    }
}

次のようにフラグメントonAttach(または別のライフサイクルメソッド)で使用します。

myActivity.lifecycle.addObserver(MyActivityObserver {
    myOnActivityCreated()
})
0
Sever

Lifecycle.Stateをグラフのノードと見なし、Lifecycle.Eventをこれらのノード間のエッジと見なすことができます。

したがって、ON_CREATE関数でState.Createdに到達することはありません。

ソリューション

class YourFragment : Fragment(), LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun onCreated(){
        Log.i("tag","reached the State.Created")
    }

    override fun onAttach(context: Context) {
        super.onAttach(context)
        lifecycle.addObserver(this)
    }

    override fun onDetach() {
        super.onDetach()
        lifecycle.removeObserver(this)
    }
}

詳細

https://developer.Android.com/topic/libraries/architecture/lifecycle#lc

0
oaosj