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é.
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()
})
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