为长标题道歉。我的问题如下:我使用DialogFragment来防止AlertDialogs在轮换时被解雇(类似于这里的答案:Prevent dialog dismissal on screen rotation in Android)。
现在,我在后台运行一些可能需要几秒钟的任务。我想展示一个progressdialog来告诉用户发生了什么。任务完成后,应该从AsyncTask中的finished方法中取消ProgressDialog。
与上面的链接一样,我使用DialogFragment创建一个Dialog。旋转时保留对话框(这很好)。然而,一旦我的任务完成并且屏幕旋转,我就无法忽略对话框。
以下是我尝试过的策略(如果屏幕没有旋转,这两种方法都有效):
有人能引导我走向正确的方向吗?
编辑:这是一些代码
在活动中,我只是创建一个执行一些后台工作的TaskFragment:
public class MainActivity extends AppCompatActivity {
private TaskFragment ft;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ft = (TaskFragment) getFragmentManager().findFragmentByTag("task");
if(ft == null) {
// create new
ft = TaskFragment.newInstance();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(ft, "task");
transaction.commit();
}
}
}
在TaskFragment中我运行AsyncTask。在onPreExecute中我显示了一个ProgressDialog,在onPostExecute中我解雇了它:
public class TaskFragment extends Fragment {
public static TaskFragment newInstance() {
return new TaskFragment();
}
public TaskFragment() {}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setRetainInstance(true);
// Run a background task and show a dialog
new AsyncTask<Void, Void, Void>() {
MyDialogFragment ft;
@Override
protected void onPreExecute() {
// show progress dialog
ft = MyDialogFragment.newInstance();
ft.show(getActivity().getFragmentManager(), "dialog");
}
@Override
protected Void doInBackground(Void...params) {
try {
// Do some work...
Thread.sleep(5000);
} catch (InterruptedException ignored) {}
return null;
}
@Override
protected void onPostExecute(Void p) {
// remove progress dialog
ft.dismiss();
}
}.execute();
}
}
DialogFragment就是以下内容:
public class MyDialogFragment extends DialogFragment {
public static MyDialogFragment newInstance() {
MyDialogFragment fragment = new MyDialogFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setCancelable(false);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
ProgressDialog dialog = new ProgressDialog(getActivity());
dialog.setIndeterminate(true);
dialog.setTitle("Hello World");
return dialog;
}
}
谢谢和最诚挚的问候, 卡尔
答案 0 :(得分:0)
感谢Selvin,您的代码和评论指出了我正确的方向。
问题是当我解雇它时我必须重新获取片段。此外,由于在关闭对话框时Activity可能不处于活动状态,因此我需要在解除它时允许stateloss以避免NullPointerException。因此,我将AsyncTask更新为以下内容并且工作正常。
// Run a background task and show a dialog
new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
// show progress dialog
MyDialogFragment ft = MyDialogFragment.newInstance();
ft.show(getActivity().getFragmentManager(), "dialog");
}
@Override
protected Void doInBackground(Void...params) {
try {
// Do some work...
Thread.sleep(5000);
} catch (InterruptedException ignored) {}
return null;
}
@Override
protected void onPostExecute(Void p) {
MyDialogFragment ft =
(MyDialogFragment) getFragmentManager()
.findFragmentByTag("dialog");
// remove progress dialog
ft.dismissAllowingStateloss();
}
}.execute();
再次感谢您的帮助。