如何在AsyncTask中的DialogFragment中显示ProgressDialog

时间:2014-08-12 12:47:56

标签: android progressdialog android-dialogfragment

我的ProgressDialog未显示 - 它在AsyncTask类 BackgroundDataLoad 中定义。

DialoguePopup类

public class DialoguePopup extends DialogFragment {

public DialoguePopup newInstace() 
{
    DialoguePopup dialogFragment = new DialoguePopup();
    return dialogFragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) 
{
    super.onCreateView(inflater, container, savedInstanceState);

    //view related code..

    //Calculation logic data load in background
    new BackgroundDataLoad().execute();
    return view;
}

class BackgroundDataLoad extends AsyncTask<String, String, String>
{
    @Override
    protected void onPreExecute() {
    super.onPreExecute();
    pDialog = new ProgressDialog(getActivity());
    pDialog.setMessage("Calculating ...");
    pDialog.setIndeterminate(false);
    pDialog.setCancelable(false);
    pDialog.show();
}

@Override
protected String doInBackground(String... params) 
{
   //Data that can take 8 seconds to load is in background process
   return null;
}

@Override
protected void onPostExecute(String result) 
{
   super.onPostExecute(result);
   pDialog.dismiss();
}

注意:

经过一些调试后,我发现我的ProgressDialog显示在DialogFragment下面,但我希望它在DialogFragment之上。

SO帖子How can I open a ProgressDialog on top of a DialogFragment?提及,

  显然,这是一个受到广泛抱怨的主题   ProgressDialog,我建议你试试一个普通的对话框,用   构建器及其布局(由您制作的自定义)包括   进度条或装载或任何你需要的。这应该解决你的问题   问题

但是我想知道你的应用程序是否在不同的视图中使用ProgressDialog那么这是使用自定义构建器执行此操作的最佳方法吗?

它阻碍了应用程序的一致性。而且,这是另一种方式。

3 个答案:

答案 0 :(得分:5)

@ My God

你只有两步之遥。

  1. onCreateDialog()

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        return dialog;
    }
    
  2. onStart()

    @Override
    public void onStart() {
        super.onStart();
        new BackgroundDataLoad().execute();
    }
    
  3. 现在您在对话框创建后执行加载任务,现在您可以查看正在显示的进度对话框。

答案 1 :(得分:2)

在DialogFragment中将ProgressDialog放在前面的简单解决方案

只需将该代码粘贴到对话框片段中,它就不会影响您现有的代码

   @Override
public void onResume() {
    super.onResume();
    if (pDialog.isShowing() && pDialog != null) {
        pDialog.dismiss();            //dirty fix for bring progress dialog front
        pDialog = new ProgressDialog(getActivity());
        pDialog.setCancelable(false);
        pDialog.setMessage("Loading...");
        pDialog.show();
    }
}

答案 2 :(得分:0)

我遇到了类似的问题,问题的根源是你在dialogFragment中创建了progressDialog。你应该做的是创建一个进度对话框,并在DialogFragment中的onCreateDialog中将其作为对话框引用传递。

类似的东西:

public class MyDialogFragment extends DialogFragment {

private ProgressDialog mProgress;

    public static JoinContactLoaderFragment newInstance() {
        JoinContactLoaderFragment fragment = new JoinContactLoaderFragment();
        return fragment;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        mProgress = new ProgressDialog(getActivity());
        mProgress.setMessage("Some text");
        mProgress.setCancelable(true);
        mProgress.setCanceledOnTouchOutside(false);
        return mProgress;
    }
}