2012-08-24 3 views
8

Ich habe gerade angefangen, DialogFragment aus der Android-Support-Bibliothek zu verwenden und es bis jetzt extrem ärgerlich zu finden. Ich habe einige benutzerdefinierte AsyncTasks, die von verschiedenen Orten in meiner App aufgerufen werden. Es gibt zwei Situationen, in denen ich Probleme mit den DialogFragments laufen:IllegalStateException bei der Verwendung von DialogFragment

  1. Beim Debuggen und der Bildschirm wird ausgeschaltet
  2. Wenn ich einen FragmentDialog von onActivityResult öffnen möchten()

beide zumindest ich denke, sind relativ häufig Situationen, und in beiden Fällen bekomme ich ein

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

Dies ist, wie mein AsyncTasks strukturiert ist:

private class UploadImageAsyncTask extends AsyncTask<Void, Void, Image> { 
    private ProgressDialogFragment dialog; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     FragmentManager fm = getSupportFragmentManager(); 
     dialog = new ProgressDialogFragment(); 
     dialog.show(fm, "ProgressDialogFragment"); 
    } 

    @Override 
    protected Image doInBackground(Void... params) { 
     ... 
    } 

    @Override 
    protected void onPostExecute(Image result) { 
     super.onPostExecute(result); 
     dialog.dismiss(); 

     ... 
     } 
    } 
} 

Ich weiß, dass ich eine Einstellung einstellen könnte, dass der Bildschirm von dem Einschlafen verhindert während des Debuggens und ich konnte ein Flag in onActivityResult() gesetzt und dann öffnen Sie den Dialog in onStart(), aber das ist nicht wirklich das, was ich suche ich. Gibt es bessere Lösungen?

Dank Simon

+0

Dies ist eine der nervigsten Probleme, die ich in Android Entwicklung erlebt haben. Die veralteten Dialog-APIs hatten dieses Problem nicht. Alle Problemumgehungen sind so hässlich. Ich konnte immer noch keine saubere Lösung für dieses Problem finden. –

+0

Ich auch nicht. Ich warte immer noch auf jemanden, der mir eine saubere Lösung zeigt: - \ – SimonSays

Antwort

4

Verwendung dialog.dismissAllowingStateLoss(); statt dialog.dismiss();