在我的主要 Activity 中,我有一个 fragment ,我在其中应用了 setRetainInstance(true),这样我在其中使用的 AsyncTask 就不会受到方向变化的干扰。
AsyncTask 处理了很多工作。这就是为什么我想在我的 Activity 顶部显示一个带有进度条的对话框。
我做了一些研究并成功地使用了 DialogFragment:
公共(public)类 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)
我做错了什么?
最佳答案
已找到解决方案!
我没有对包含我的 AsyncTask 的 fragment 做正确的事情。
因为,我还没有真正理解 Fragment 中方向的概念,感谢这个链接:http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
关于android - 带有屏幕旋转的 Fragment 上的 DialogFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17600506/