web-dev-qa-db-fra.com

onActivityCreated est obsolète, comment utiliser correctement LifecycleObserver?

Google désapprouve le fragment onActivityCreated () sur Android et recommande d'utiliser 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.

J'essaie donc de le faire de la manière recommandée, mais le seul état que je peux observer dans Logcat est juste État: INITIALISÉ.

 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)
}

Quel est le problème dans le code ci-dessus?

PDATE 1: On dirait que j'ai oublié d'utiliser hostActivity.lifecycle.currentState et vérifié le cycle de vie du fragment au lieu du cycle de vie des activités.

PDATE 2: L'approche suggérée par Google n'a pas fonctionné pour 1 activité hôte et 2 fragments lorsque vous cliquez sur le bouton retour de l'un à l'autre, car onAttach n'a jamais été appelé, mais onActivityCreated appelé.

5
Sever

Je l'ai fait de la manière suivante:

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

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

et utilisez-le dans des fragments onAttach (ou une autre méthode de cycle de vie) comme:

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

Vous pouvez considérer Lifecycle.State comme les nœuds dans un graphique et Lifecycle.Event comme les arêtes entre ces nœuds.

Vous n'atteindrez donc jamais l'état créé sur votre fonction ON_CREATE.

Solution

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)
    }
}

Pour plus de détails

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

0
oaosj