9

Dopo il rilascio dell'API Fragments, ho iniziato a trasferire tutte le finestre di dialogo deprecate in DialogFraments utilizzando il pacchetto di compatibilità. Tutto funzionava bene, fino a quando mi accorgo che i miei dialoghi stanno causando crash solo ICS:Visualizzazione degli arresti di DialogFragments ICS

E/AndroidRuntime( 883): FATAL EXCEPTION: main 
E/AndroidRuntime( 883): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
E/AndroidRuntime( 883): at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1254) 
E/AndroidRuntime( 883): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1265) 
E/AndroidRuntime( 883): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541) 
E/AndroidRuntime( 883): at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525) 
E/AndroidRuntime( 883): at android.support.v4.app.DialogFragment.show(DialogFragment.java:123) 
E/AndroidRuntime( 883): at com.myapp.ui.dialogs.TwoButtonDialogFragment.showDialog(TwoButtonDialogFragment.java:84) 

mie finestre di dialogo sono visualizzate sul AsyncTask.onPostExecute() al fine di mostrare una risposta HTTP per l'utente. Dopo essermi immerso nel problema, sono giunto alla conclusione che questa eccezione si verifica solo quando l'attività è in pausa o interrotta e non si verifica su altre versioni di Android. Ho provato a usare commitAllowingStateLoss(), ma non aiuta, poiché l'eccezione è lanciata su DialogFragment.show(). Ecco il mio codice per DialogFragment:

private static void showDialog(FragmentActivity activity, String title, String msg, 
     String positiveButtonText, String negativeButtonText, int id, Bundle args) { 

    if (activity.isFinishing()) { 
     return; 
    } 

    FragmentManager fmgr = activity.getSupportFragmentManager(); 
    FragmentTransaction ft = fmgr.beginTransaction(); 
    Fragment prev = fmgr.findFragmentByTag(TAG); 
    if (prev != null) { 
     try { 
      ft.remove(prev); 
     } catch (IllegalStateException ex) { 
      // issue: http://code.google.com/p/android/issues/detail?id=17029 
     } 
    } 

    TwoButtonDialogFragment newFragment = new TwoButtonDialogFragment(); 
    if (args == null) { 
     args = new Bundle(); 
    } 
    args.putString("title", title); 
    args.putString("message", msg); 
    args.putString("positiveButtonText", positiveButtonText); 
    args.putString("negativeButtonText", negativeButtonText); 
    args.putInt("id", id); 
    newFragment.setArguments(args); 
    newFragment.setCancelable(false); 
    newFragment.show(fmgr, TAG); // exception is thrown here 
    ft.commit(); 
} 


@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    final Bundle args = getArguments(); 
    String title = args.getString("title"); 
    String msg = args.getString("message"); 
    String positiveButtonText = args.getString("positiveButtonText"); 
    String negativeButtonText = args.getString("negativeButtonText"); 
    final int id = args.getInt("id"); 

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    if (!TextUtils.isEmpty(title)) { 
     builder.setTitle(title); 
    } 
    builder.setMessage(msg); 

    final TwoButtonDialogHandler handler = (TwoButtonDialogHandler) getActivity(); 
    builder.setPositiveButton(positiveButtonText, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) {    
      handler.doPositiveClick(id, args); 
     } 
    }); 
    builder.setNegativeButton(negativeButtonText, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
      handler.doNegativeClick(id, args); 
     } 
    }); 

    return builder.create(); 
} 

È un errore su ICS? Cosa dovrei fare?

+0

Vedere [here] (http://stackoverflow.com/questions/7992496/how-to-handle-asynctask-onpostexecute-when-paused-to-avoid-illegalstateexception) per domande e risposte simili. – PJL

risposta

3

Ho riscontrato questo problema e non sono riuscito a trovare alcun modo nel framework per risolvere questo problema.

Tuttavia mi ha fornito una soluzione al problema che potete vedere al seguente link

2

Questa Google link indirizzi lo stesso problema. Sembra un bug nella compatibilità lib.

Problemi correlati