2013-07-11 3 views
4

В моем основном действии у меня есть фрагмент, в котором я применяю setRetainInstance (true), так что AsyncTask, который я использую в нем, не мешает изменению ориентации.Диалог Фрагмент на фрагменте с поворотом экрана

Много работы обрабатываются AsyncTask. Вот почему я хотел бы отобразить диалог с progressBar поверх моей активности.

Я сделал некоторые исследования, и я успешно делать с DialogFragment:

общественный класс DialogWait простирается DialogFragment {

private ProgressBar progressBar; 

public DialogWait() { 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.dialog_wait, container); 

    Dialog dialog = getDialog(); 
    dialog.setTitle("Hello"); 
    setCancelable(false); 

    progressBar = (ProgressBar) view.findViewById(R.id.progress); 

    return view; 
} 

public void updateProgress(int value) { 
    progressBar.setProgress(value); 
} 

А вот мой AsyncTask:

public class InitAsyncTask extends AsyncTask<Void, Integer, Void> { 

private Context activity; 
private OnTaskDoneListener mCallback; 
private DialogWait dialog; 

public InitAsyncTask(Context context, OnTaskDoneListener callback, DialogWait dialogWait) { 
    activity = context; 
    mCallback = callback; 
    dialog = dialogWait; 
} 

@Override 
protected Void doInBackground(Void... params) { 
    doStuff(); 

    return null; 
} 

@Override 
protected void onProgressUpdate(Integer... values) { 
    dialog.updateProgress(values[0]); 
} 

@Override 
protected void onPostExecute(Void result) {  
    publishProgress(100); 
      if(dialog != null) 
     dialog.dismiss(); 
    mCallback.onTaskDone(); 
} 

private void doStuff() { 
      //... 
    } 

}

Если я не меняю поворот экрана, он отлично работает. Но если я это сделаю, диалог будет уволен, и через несколько секунд у меня получилось NullPointerEsception, которое было бы бессмысленным, поскольку я установил условие: if (dialog! = Null)

Что я делаю неправильно?

ответ

1

Override onCreate и onDestroyView методы в вашем DialogWait следующим образом:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setRetainInstance(true);   
} 


@Override 
public void onDestroyView() { 
    if (getDialog() != null && getRetainInstance()) { 
     getDialog().setDismissMessage(null); 
    } 
    super.onDestroyView(); 
} 
+0

Я попытался, но поведение точно такой же ... – lost17

+0

@Shajeel вы не должны используйте setRetainInstance с фрагментами пользовательского интерфейса, я предполагаю, что диалоговые окна автоматически соответствуют этому описанию? – Maxrunner