2017-08-02 1 views
1

Je tente d'appeler une boîte de dialogue personnalisée uniquement si l'application a démarré.Lifecycle State toujours INITIALIZED

if (mGameActivity.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) { 
    mDialogWinByLeft.show(mGameActivity.getSupportFragmentManager(), ""); 
} 

Mais l'état actuel est toujours INITIALISÉ. Im implémentant l'interface LifecycleRegistryOwner sur GameActivity. Désolé si je n'ai pas bien compris cette nouvelle API. Merci

+0

Vous avez le même problème pour le fragment appCompat. Pablo, connaissez-vous la solution pour cela? –

+0

Non désolé, je n'ai pas utilisé cette api plus –

Répondre

1

Basé sur votre description Je risque de deviner que vous vérifiez l'état dans onCreate. Pendant le onCreate l'état du cycle de vie est seulement INITIALIZED.

Voir ce diagramme de Google. Cela signifie que vous pouvez utiliser la bibliothèque d'annotations pour observer lorsque vous avez entré l'état STARTED.

@OnLifecycleEvent(Lifecycle.EVENT.ON_START) 
void doSomething(){ 
    //do the thing that needs the lifecycle to be at least started 
} 

Cela dit cela est appelé après chaque onStart est terminé. Il peut donc être prudent de faire une certaine logique pour déterminer si c'est le bon moment pour faire les choses qui doivent être faites.

De même, pour que ce code fonctionne, la classe qui doit observer l'événement Lifecycle doit implémenter LifecycleObserver. Cela pourrait être n'importe quelle classe ou même l'activité ou le fragment lui-même. Le code ci-dessous est pour une classe générale/module qui agira comme un observateur Lifecycle.

public class LifeCycleObserverModule implements LifecycleObserver { 
    LifeCycleObserverModule(Lifecycle lifecycle) { 
     //register the life cycle to observe 
     this.lifecycle = lifecycle; 
     this.lifecycle.addObserver(this); 
    } 
} 

Si vous deviez faire une activité observer son propre cycle de vie, il serait quelque chose comme:

public class MainActivity extends AppCompatActivity implements LifecycleObserver { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     getLifecycle().addObserver(this) 
    } 
} 

Pour un fragment, il fonctionne de la même, mais il observateur pourrait-il son propre cycle de vie ou celle de la activité. Si vous voulez observer le cycle de vie de l'activité, vous pouvez le faire. Sinon, ce serait la même chose que pour l'exemple d'activité ci-dessus.

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    getActivity().getLifecycle().addObserver(this); 
} 

Une note finale, je ne suis pas tout à fait clair sur si une activité ou Fragment observant son propre cycle de vie est la meilleure pratique. Mais cela fonctionne, et il ne semble pas y avoir de conséquences néfastes. J'utilise actuellement la méthode ci-dessus dans quelques applications sur lesquelles je travaille.

EDIT: a corrigé l'exemple de code. Il était utilisé pour dire @OnLifecycleEvent(Lifecycle.EVENT.STARTED) comme cela a été souligné dans un commentaire STARTED n'existe pas, la valeur correcte était ON_START. Désolé pour le mélange.

+0

Ce code ne fonctionne pas. Il n'y a pas non plus Lifecycle.Event "Started". –

+0

@SlavaSotone vous avez raison. Je ne sais pas pourquoi je me suis coincé dans ma tête quand j'ai écrit cela à l'origine. J'ai aussi ajouté un code plus détaillé pour montrer comment faire fonctionner le code. – Azethoth

+0

À partir de appCompat 26.1, vous n'avez pas besoin de créer un observateur. Pour obtenir l'état de cycle de vie pour android.support.v4.app.Fragment ou AppCompatActivity, utilisez simplement: lifecycle.currentState.isAtLeast (Lifecycle.STATE.STARTED) –

0

L'état du cycle de vie peut être INITIALISÉ si vous vérifiez l'état lors de la première initialisation, par exemple juste après l'appel onStart(). Après l'initialisation complète de l'activité ou du fragment, vous pouvez obtenir l'état de cycle de vie approprié. Donc si vous utilisez com.android.support:appcompat-v7:26.1.0, pour android.support.v4.app.Fragment ou de l'utilisation de AppCompatActivity suivant:

lifecycle.currentState.isAtLeast(Lifecycle.STATE.STARTED) 

Dans la plupart des cas, pas besoin de créer LifecycleObserver personnalisé.