0

Извинения за длинный заголовок. Моя проблема заключается в следующем: я использую 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; 
    } 
} 

Спасибо и наилучшими пожеланиями, Карл

+1

Где минимальный код? ... – Selvin

+0

в любом случае: https://gist.github.com/SelvinPL/4230c0b6b45fb69a8ed856a4fa43dec3 – Selvin

+0

Просто добавил минимальный код. Спасибо за код, я думаю, что он указывает мне в правильном направлении (я думал, что DialogFragments сохраняются и не воссоздаются после вращения). Будет проверено.Спасибо (и извините за то, что вы не добавили минимальный пример кода в первую очередь. – Searles

ответ

0

Благодаря Selvin, код и комментарий указал мне в правильном направлении.

Проблема в том, что я должен только что получить Фрагмент, когда я его отклоню. Кроме того, поскольку действие может не быть активным, когда диалог отклонен, мне нужно разрешить 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(); 

Снова благодарит за вашу помощь.

Смежные вопросы