带有屏幕旋转的Fragment上的DialogFragment

时间:2013-07-11 18:12:59

标签: android rotation fragment

在我的主要活动中,我有一个Fragment,我在其中应用了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() {
          //...
    }

}

如果我不更改屏幕旋转,它可以正常工作。但是,如果我这样做,对话框被解除,几秒钟之后,我得到了一个N​​ullPointerEsception,因为我设置条件是无意义的:if(dialog!= null)

我做错了什么?

2 个答案:

答案 0 :(得分:3)

找到解决方案!

我没有使用包含我的AsyncTask的Fragment做正确的事。

因为,我还没有真正理解Fragment中的方向概念,所以感谢这个链接:http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

答案 1 :(得分:1)

覆盖onCreate中的onDestroyViewDialogWait方法,如下所示:

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

    setRetainInstance(true);        
}


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