53

Zacząłem używać DialogFragment, ponieważ działają one ładnie poprzez zmiany orientacji i takie tam. Ale napotkam na paskudny problem.Właściwy sposób odrzucania DialogFragment, gdy aplikacja działa w tle

Mam AsyncTask, który pokazuje postęp DialogFragment i odrzuca go onPostExecute. Wszystko działa dobrze, z wyjątkiem sytuacji, gdy onPostExecute dzieje się, gdy aplikacja jest w tle (po naciśnięciu przycisku Home, na przykład). Następnie dostałem ten błąd na zwolnieniu DialogFragment - "Can not perform this action after onSaveInstanceState". Doh. Regularne dialogi działają dobrze. Ale nie FragmentDialog.

Zastanawiam się, jaki jest właściwy sposób odrzucania DialogFragment, gdy aplikacja jest w tle? Tak naprawdę nie pracowałem z Fragments, więc myślę, że po prostu coś mi brakuje.

+0

patrz [o] (http://stackoverflow.com/questions/7992496/how-to-handle-asynctask-onpostexecute-when-paused-to-avoid-illegalstateexception) dla mi roztworu stosując wstrzymany handler – PJL

Odpowiedz

108

DialogFragment ma metodę zwaną dismissAllowingStateLoss()

+7

Działa to tylko wtedy, gdy używasz: ['show (FragmentManager, tag)'] (http://developer.android.com/reference/android/app/DialogFragment.html#show (android.app.FragmentManager,% 20java .lang.String)), ale nie podczas używania ['show (FragmentTransaction, tag)'] (http://developer.android.com/reference/android/app/DialogFragment.html#show (android.app.FragmentTransaction,% 20java.lang.String)), ponieważ 'popBackStack' w' dismissInternal' wywołuje 'enqueueAction (..., allowStateLoss = false) mimo, że poprosiliśmy o umożliwienie utraty stanu. I robi to w obu wersjach framework i support. – TWiStErRob

+0

http://stackoverflow.com/a/10261449/1815624 – CrandellWS

0

Rozwiązaniem, które może działać, jest ustawienie Fragment.setRetainInstance(true) w oknie dialogowym, ale nie jest to najładniejsza z poprawek.

Czasami zauważyłem, że muszę umieścić w kolejce moje akcje w oknie dialogowym, aby struktura mogła najpierw przywrócić stan. Jeśli możesz zdobyć bieżący Looper (Activity.getMainLooper()) i zawinąć go w programie obsługi, możesz spróbować przekazać swoje odwołanie do tyłu kolejki, publikując działającą w tej kolejce.

Często używam osobnego fragmentu, który ma retaininstance(true), który ma ResultReceiver. Tak więc przekazuję odbiornik wyników do moich zadań i obsługuję wywołania zwrotne w jego onReceive (często jako router dla innych odbiorników). Ale to może być trochę więcej pracy, niż warto, jeśli używasz zadań asynchronicznych.

8

To co zrobiłem (df == dialogFragment):

upewnić się, że nazywają się okno dialogowe w ten sposób:

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

Gdy chcesz dismis markę dialogowe ten czek:

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

Upewnij się, że masz następujące elementy w metodzie onResume() swojego fragmentu (nie df)

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

ten sposób okno dialogowe zostanie odrzucona, jeśli jest widoczny .. jeśli nie jest widoczna w oknie dialogowym będzie dismisded następny fragment staje się widoczny (onResume) ...

+0

To zawsze odrzuca fragment, gdy użytkownik wraca, a jeśli nie przeczytał jeszcze okna dialogowego, po prostu zostawił aplikację zaraz po wyświetleniu? – TWiStErRob

+0

teraz mogę wyłączyć okno dialogowe za pomocą tego kodu –

3

to co miałem zrobić, aby osiągnąć to, co chcesz: mam aktywność fragment, w którym byłem pokazując fragment dialogowe o nazwie fragment_RedemptionPayment który jest globalnie zadeklarowane na szczyt. Poniższy kod odsyła kod DialogFragment, jeśli był wyświetlany, zanim działanie zostanie wykonane w tle i powróci na pierwszy plan.

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