11

Ho un IllegalStateException a mostrare un DialogFragment:commitAllowingStateLoss su DialogFragment

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 

so perché la sua accadendo ma voglio utilizzare commitAllowingStateLoss a mostrare dialogo sovrascrivendo DialogFragment show funzione:

public void show(FragmentManager manager, String tag) { 
    mDismissed = false; 
    mShownByMe = true; 
    FragmentTransaction ft = manager.beginTransaction(); 
    ft.add(this, tag); 
    ft.commit(); //replace it by commitAllowingStateLoss 
} 

ma non ho accesso alle variabili mDismissed e mShownByMe, come posso accedere a quelle variabili per modificarle em come faceva il genitore.

risposta

23

penso per evitare gettare IllegalStateException su DialogFragment potrebbe essere meglio usare:

YourDialogFragment dialogFragment = new YourDialogFragment(); 
fragmentManager.beginTransaction().add(dialogFragment, YourDialogFragment .TAG_FRAGMENT).commitAllowingStateLoss(); 

invece di utilizzare show() su DialogFragment.

2

La soluzione su commitAllowingStateLoss funziona se DialogFragment non ha uno stato da salvare, altrimenti andranno persi come il nome della funzione indicato. Ma penso che nella maggior parte dei casi abbiamo lo stato di salvare, questo è il principale vantaggio di DialogFragment: Android lo ricrea e mantiene il suo stato automaticamente.

Una soluzione migliore sarebbe quella di verificare se il processo di ricomposizione è stato eseguito, in caso contrario, tornare al chiamante, che è un'attività o un FragmentActivity, dovrebbe chiamarlo contrassegnarlo e richiamare la funzione di spettacolo più avanti nel suo onPostResume() o onResumeFragments() callback, che possiamo assicurarci che tutti i frammenti siano ricreati.

Qui è uno spettacolo override() da una sottoclasse di DialogFragment:

public boolean show(FragmentManager fragmentManager) { 
    if (fragmentManager.isStateSaved()) return false; 
    show(fragmentManager, tagName); 
    return true; 
}