Question

Je commencé à utiliser DialogFragment, parce qu'ils travaillent bien par des changements d'orientation, et d'autres choses. Mais il y a un problème désagréable que j'ai rencontré.

Je AsyncTask qui montre les progrès DialogFragment et REJETTE onPostExecute. Tout fonctionne très bien, sauf quand onPostExecute arrive alors que l'application est en arrière-plan (après avoir appuyé sur le bouton Home, par exemple). Puis je suis arrivé cette erreur sur destituant DialogFragment - « Can not perform this action after onSaveInstanceState ». Doh. dialogues réguliers fonctionne très bien. Mais pas FragmentDialog.

Alors je me demande, quelle est la bonne façon de rejeter DialogFragment alors que l'application est en arrière-plan? Je ne l'ai pas vraiment travaillé avec Fragments beaucoup, donc je pense que je suis juste manque quelque chose.

Était-ce utile?

La solution

DialogFragment a une méthode appelée dismissAllowingStateLoss()

Autres conseils

Voici ce que je faisais (df == dialogFragment):

Assurez-vous que vous appelez la boîte de dialogue de cette façon:

df.show(getFragmentManager(), "DialogFragment_FLAG");

Si vous voulez dismis la boîte de dialogue à cette vérification:

if (df.isResumed()){
  df.dismiss();
}
return;

Assurez-vous que vous avez les éléments suivants dans la méthode onResume () de votre fragment (non df)

@Override
public void onResume(){
  Fragment f = getFragmentManager().findFragmentByTag("DialogFragment_FLAG");
  if (f != null) {
    DialogFragment df = (DialogFragment) f;
    df.dismiss();
  }
  super.onResume();
}   

De cette façon, la boîte de dialogue sera rejetée si elle est visible .. sinon visible la boîte de dialogue va être dismisded suivant le fragment devient visible (onResume) ...

est ce que je devais faire pour obtenir ce que vous voulez: J'ai une activité Fragment sur laquelle je montrais un fragment de dialogue nommé fragment_RedemptionPayment qui est déclarée globalement au sommet. Le code suivant rejette la DialogFragment si elle montrait avant l'activité va en arrière-plan et revient au premier plan.

     @Override
        public void onResume() {
            super.onResume();        
            if(fragment_RedemptionPayment.isVisible()){
                fragment_RedemptionPayment.dismiss();
            }
}

Une solution que le travail pourrait se couchait Fragment.setRetainInstance(true) dans votre dialogfragment, mais ce n'est pas la plus jolie des corrections.

Parfois, je l'ai remarqué que je dois faire la queue mes actions de dialogue pour que le cadre de restaurer l'état premier. Si vous pouvez mettre la main sur la (Activity.getMainLooper()) boucleur actuelle et wrap que dans un gestionnaire, vous pouvez essayer passer votre licenciement à l'arrière de la file d'attente en affichant un runnable sur cette file d'attente.

Je finissent souvent à l'aide d'un fragment séparé qu'il retaininstance(true) qui a un ResultReceiver. Donc, je passe sur ce récepteur résultat à mes travaux et callbacks poignée dans sa OnReceive (souvent en tant que routeur pour d'autres récepteurs). Mais cela pourrait être un peu plus de travail que cela vaut la peine si vous utilisez des tâches asynchrones.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top