Android - Comment rejeter toutes les boîtes de dialogue dans onPause
J'ai une activité qui pourrait montrer différentes boîtes de dialogue pendant l'exécution. J'utilise onCreateDialog (int id) pour créer chaque boîte de dialogue et j'utilise la méthode ShowDialog(int id) et dismissDialog(int id) pour afficher et rejeter chaque boîte de dialogue respectivement.
Quand onPause () est appelée, Je ne sais pas quelle boîte de dialogue (le cas échéant) est affichée. Je veux m'assurer que lorsque onPause est appelé, toutes les boîtes de dialogue sont dimissed. Est-il recommandé de fermer toutes les boîtes de dialogue? Devrais-je appeler dismissDialog () pour chaque dialogue?
3 réponses
Selon le nombre de dialogues dont nous parlons. La réponse courte est oui, vous devrez rejeter chaque boîte de dialogue.
Il peut y avoir des façons élégantes de le faire autre que de simplement avoir quelques boîtes de dialogue déclarées au niveau de l'activité. Vous pouvez stocker toutes les boîtes de dialogue dans un HashMap une fois qu'elles sont déclarées, puis parcourir la liste et fermer chacune onPause.
Puisque vous ne savez pas lesquels sont ouverts, vous devrez passer par et tester ou suivre les États.
Cependant, si vous avez vraiment autant de dialogues sur votre écran, vous pouvez avoir des problèmes avec votre conception UI / UX Car Android devrait vous donner un modèle qui le rend facile à implémenter sans ce qui semble être une mauvaise conception.
Si vous utilisez DialogFragment et que vous voulez ignorer tout ce que vous pouvez utiliser:
/**
* Dismiss all DialogFragments added to given FragmentManager and child fragments
*/
public static void dismissAllDialogs(FragmentManager manager) {
List<Fragment> fragments = manager.getFragments();
if (fragments == null)
return;
for (Fragment fragment : fragments) {
if (fragment instanceof DialogFragment) {
DialogFragment dialogFragment = (DialogFragment) fragment;
dialogFragment.dismissAllowingStateLoss();
}
FragmentManager childFragmentManager = fragment.getChildFragmentManager();
if (childFragmentManager != null)
dismissAllDialogs(childFragmentManager);
}
}
Avec l'accent récent d'android sur l'utilisation du conteneurDialogFragment Vous n'aurez pas besoin d'appeler dismiss sur chaque
Puisque les boîtes de dialogue auront un conteneur de fragments, vous pouvez simplement utiliser leur cycle de vie . Considérez ce DialogFragment:
public class FragDialog extends DialogFragment{
public ProgressDialog _dialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
//this.dismiss(); <-- The dialogs may be dismissed here
}
}
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
_dialog = new ProgressDialog(getActivity());
return _dialog;
}
@Override
public void onPause() {
super.onPause();
// <--------- You may overload onPause
}
}
Que vous montrerez dans votre activité en utilisant un fragmentmanager l'appelant normalement comme ceci:
FragmentManager fm = getSupportFragmentManager();
FragDialog fragDialog = new FragDialog();
fragDialog.show(fm, "my_tag");
Notez que vous pouvez réellement modifier ce que le DialogFragment fait dans onPause. Lorsque votre activité appelle onPause, cette onPause sera appelée aussi.
Fermer la boîte de dialogue dans onPause () en utilisant ceci.dismiss () ne fera pas le travail car une fois que l'activité reprendra, elle reprendra également la boîte de dialogue. (Je pense que c'est parce que le savestate est stocké avant onPause).
Mais vous pouvez rejeter en toute sécurité la(Les) boîte (s) de dialogue dans onCreate si vous détectez un savedInstanceState (un CV) comme indiqué dans le code.