0

Я использую библиотеку совместимости v4 +. Следующее за другими threads и dev guide Я пытаюсь создать фрагмент, который вызывает диалог прогресса из действия, которое его создает. Этот подход использует DialogFragment, отображаемый в предварительном выполнении AsyncTask и отклоненный (удаленный) при выполнении post. В результате я не получаю никакого диалога .... ну, правда в том, что диалог отображается только на долю секунды в конце thread.sleep.android: progress DialogFragment не отображается в начале AsyncTask

Может кто-нибудь сказать мне, где я ошибаюсь?

У меня есть фрагмент здесь:

public class GroupsDetailsFragment extends BaseFragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View v = inflater.inflate(R.layout.fragment_groups_details, container, false); 

     return v; 
    } 



    @Override 
    public void onStart() { 
     // TODO Auto-generated method stub 
     super.onStart(); 
     loadPage(); 
    } 



    public void loadPage() { 
     Log.i(TAG, "loadPage"); 
     new LoadPageTask(getBaseActivity()).execute(); 
    } 

    public void executeLoadPagePreExecution() {Log.i(TAG, "executeLoadPagePreExecution"); } 
    public void executeLoadPageInBackground() {Log.i(TAG, "executeLoadPageInBackground"); } 
    public void executeLoadPagePostExecution() {try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }Log.i(TAG, "executeRefreshPostExecution"); } 



    protected class LoadPageTask extends AsyncTask<Void, Void, String> { 
     private Context context; 

     public LoadPageTask(Context context) { 
      super(); 
      this.context = context; 
     } 

     @Override 
     protected void onPreExecute() { 
      // before the network request begins, show a progress indicator 
      getBaseActivity().showLoadingProgressDialog(context); 
      executeLoadPagePreExecution(); 
     } 

     @Override 
     protected String doInBackground(Void... params) { 
      String result = executeLoadPage(); 
      Log.i(TAG, "error message result: " + result); 
      return result; 
     } 


     // Returns null if Everything is OK. Error Message if any problem. 
     private String executeLoadPage() { 
      try { 
       executeLoadPageInBackground(); 
       return null; 
      } catch (Exception e){ 
       Log.w(TAG, e.getMessage(), e); 
       return(e.getMessage()); 
      } 
     } 

     @Override 
     protected void onPostExecute(String message) { 
      executeLoadPagePostExecution(); 
      getBaseActivity().dismissProgressDialog(); 
      if (message!=null){ 
       Utility.showMessageAlertDialog(message, context); 
      } 
     } 
    } 

} 

И ProgressDialogFragment, который является внутренним классом FragmentActivity, что dispays фрагмент:

public static class ProgressDialogFragment extends DialogFragment { 


     public static ProgressDialogFragment newInstance(String title, String message) { 
      ProgressDialogFragment fragment = new ProgressDialogFragment(); 
      Bundle args = new Bundle(); 
      args.putString("title", title); 
      args.putString("message", message); 
      fragment.setArguments(args); 

      return fragment; 
     } 

     @Override 
     public ProgressDialog onCreateDialog(Bundle savedInstanceState) { 
      String title = getArguments().getString("title"); 
      String message = getArguments().getString("message"); 

      ProgressDialog progressDialog = new ProgressDialog(getActivity()); 
      progressDialog.setTitle(title); 
      progressDialog.setMessage(message); 

      progressDialog.show(); 

      return progressDialog; 
     } 
    } 


    public void showProgressDialog(String title, String message) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     Fragment prev = fragmentManager.findFragmentByTag("progress dialog"); 
     if(prev!=null) { 
      fragmentTransaction.remove(prev); 
     } 
     fragmentTransaction.addToBackStack(null); 

     DialogFragment newFragment = ProgressDialogFragment.newInstance(title, message); 
     newFragment.show(fragmentManager, "progress dialog"); 
     //fragmentTransaction.commit(); 
    } 

    public void removeProgressDialog() { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     Fragment prev = fragmentManager.findFragmentByTag("progress dialog"); 
     if(prev!=null) { 
      fragmentTransaction.remove(prev); 
     } 
     fragmentTransaction.commit(); 
    } 
+0

Как насчет метода setprogresstate. Также как вы используете фрагмент диалога вне класса basefragment? вы можете передать getSupportFragmentManager? – Maxrunner

ответ

0

Обычно вы не должны приостановить поток пользовательского интерфейса. Итак, как насчет перемещения Thread.Sleep() в doInBackground()? Это работает для вас?

+0

Да, я это знаю. Это был просто тест ... Однако, просто из любопытства после твоего ответа я решил отдать его. И достаточно смешно (по крайней мере для моего понимания ..) это сработало. Может кто-нибудь объяснить мне, почему? – virtual82

0

doInBackGround, где работа выполняется на рабочем потоке (только не поток пользовательского интерфейса), onPostExacute является то, что переговоры с главным UI .. поэтому

0

Я не думаю, что вы должны называть

progressDialog.show() in onCreateDialog (...)

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

  • Нет связанных вопросов^_^