2012-02-08 27 views
30

Mam działanie, które może wyświetlać różne okna dialogowe podczas wykonywania. Używam onCreateDialog (int id) do tworzenia każdego okna dialogowego i używam metody showDialog (int id) i dismissDialog (int id) do wyświetlania i odrzucania każdego z okien dialogowych.Android - jak wyłączyć wszystkie okna dialogowe w trybie onPause

Po wywołaniu funkcji onPause() nie wiem, które okno dialogowe (jeśli jest) jest wyświetlane. Chcę się upewnić, że po wywołaniu funkcji onPause wszystkie okna dialogowe są dezaktywowane. Czy istnieje zalecany sposób odrzucania wszystkich okien dialogowych? Czy musiałbym wywołać metodę dismissDialog() dla każdego okna dialogowego?

+0

zaktualizowałem odpowiedź – quinestor

Odpowiedz

12

W zależności od tego, o ile dialogów mówimy. Krótka odpowiedź brzmi: tak, musisz zamknąć każde okno dialogowe.

Możliwe są eleganckie sposoby na to, inne niż po prostu kilka dialogów zadeklarowanych na poziomie aktywności. Możesz przechowywać wszystkie dialogi w HashMapie po ich zadeklarowaniu, a następnie iterować listę i zamykać każdą z nich onPause.

Ponieważ nie wiesz, które są otwarte, musisz przejść i przetestować lub śledzić stany.

Jeśli jednak masz naprawdę wiele okien dialogowych na ekranie, możesz mieć problemy z projektowaniem UI/UX, ponieważ Android powinien dać ci model, który ułatwia jego implementację bez tego, co wydaje się złym projektem.

+6

Ponadto, aby uniknąć błędów z odwoływania zamkniętych okien dialogowych, można użyć try-catch każdy czas odrzucić okno dialogowe. Kodowanie jest o wiele łatwiejsze niż sprawdzanie otwartych okien dialogowych. – Arci

7

z Androidem niedawnej naciskiem na użyciu DialogFragment kontenerze nie wil trzeba zadzwonić odwołać w każdym

Ponieważ dialogi będą mieć pojemnik fragment może po prostu użyć ich cykl. Rozważmy następujący 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 
    } 
} 

Który będzie można pokazać w swojej działalności za pomocą fragmentmanager zwykle nazywając go tak:

FragmentManager fm = getSupportFragmentManager(); 
FragDialog fragDialog = new FragDialog(); 
fragDialog.show(fm, "my_tag"); 

pamiętać, że może rzeczywiście zmienić to, co robi w OnPause DialogFragment. Gdy twoja aktywność dzwoni w trybie onPause, ta funkcja onPause również zostanie wywołana.

Odrzucenie okna dialogowego w trybie onPause() przy użyciu metody this.dismiss() nie spowoduje wykonania tej czynności, ponieważ po wznowieniu działania zostanie wznowione również okno dialogowe. (Myślę, że dzieje się tak dlatego, że save jest przechowywana przed onPause).

Ale można bezpiecznie odrzucić okna dialogowe w trybie onCreate, jeśli wykryje się zapisany stan rekordu (wznowienie), jak pokazano w kodzie.

+0

To jest zgrabne rozwiązanie i nadal działa w 2018 roku, dzięki! – Micer

12

Jeśli używasz DialogFragment i chcesz odrzucić wszystko, co można użyć:

/** 
* 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); 
    } 
} 
+0

Wygląda jak najczystsze rozwiązanie dla DialogFragment. Czy używasz go w swoich aplikacjach produkcyjnych? –

+0

@ grub - tak, robię –

Powiązane problemy