Извинения за длинный заголовок. Моя проблема заключается в следующем: я использую DialogFragment для предотвращения отклонения AlertDialogs при вращении (похоже на ответ здесь: Prevent dialog dismissal on screen rotation in Android).Предотвратить увольнение ProgressDialog при ротации, но все же разрешить увольнение с AsyncTask
Теперь я запустил некоторую задачу в фоновом режиме, которая может занять несколько секунд. Я хочу показать progressdialog, чтобы сообщить пользователю, что происходит. Как только задача будет выполнена, ProgressDialog следует убрать из готового метода в AsyncTask.
Как в ссылке выше, я использую DialogFragment для создания диалога. Диалог сохраняется при вращении (что хорошо). Тем не менее, как только моя задача выполнена, и экран был повернут, я не могу отклонить диалог.
Вот стратегии, которые я пробовал (оба метода работают, если экран не был повернут):
- Calling «уволить()» на DialogFragment. После поворота экрана это вызывает сбой java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.app.FragmentTransaction android.app.FragmentManager.beginTransaction()' на ссылке нулевого объекта android.app.DialogFragment.dismissInternal (DialogFragment.java:296) android.app.DialogFragment.dismiss (DialogFragment.java:267)
- Вызов некоторого внутреннего метода, который вызывает «getDialog() .открыть()»: getDialog() всегда возвращает null (после вращения) хотя диалог показан.
Может ли кто-нибудь привести меня в правильном направлении?
EDIT: Вот код
Внутри деятельности, я просто создать 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;
}
}
Спасибо и наилучшими пожеланиями, Карл
Где минимальный код? ... – Selvin
в любом случае: https://gist.github.com/SelvinPL/4230c0b6b45fb69a8ed856a4fa43dec3 – Selvin
Просто добавил минимальный код. Спасибо за код, я думаю, что он указывает мне в правильном направлении (я думал, что DialogFragments сохраняются и не воссоздаются после вращения). Будет проверено.Спасибо (и извините за то, что вы не добавили минимальный пример кода в первую очередь. – Searles