【问题标题】:How to show ProgressDialog in a DialogFragment in AsyncTask如何在 AsyncTask 的 DialogFragment 中显示 ProgressDialog
【发布时间】:2014-08-12 12:47:55
【问题描述】:

我的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,我建议你尝试一个普通的对话框,用 builder 并且其布局(由您定制的)包括 进度条或加载或任何你需要的。这应该解决你的 问题。

但我想知道您的应用程序是否在不同的视图中始终使用ProgressDialog,那么这是使用自定义生成器的最佳方式吗?

它会妨碍您的应用程序的一致性。而且,那是另一种方式。

【问题讨论】:

  • pDialog 的声明在哪里?是在活动吗?
  • 您在DialoguePopup 中扩展DialogFragment。没有Activity Context
  • @Paritosh - 见上面的代码。它在AsyncTask 的onPreExecute() 方法中声明。
  • @PRAKASHUBHADIYA - 我的DialogFragment 已附加到一个活动,所以我正在做getActivity() 以获取context。如果它不存在,我应该在getActivity() 调用时得到空指针异常。
  • @VedPrakash 我问的是声明,而不是定义。如果它在活动中声明,我们必须获取它的实例。

标签: android progressdialog android-dialogfragment


【解决方案1】:

@我的上帝

离你只有两步之遥。

  1. onCreateDialog()作为

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

    @Override
    public void onStart() {
        super.onStart();
        new BackgroundDataLoad().execute();
    }
    

现在您的加载任务将在对话框创建后执行,所以现在您可以查看正在显示的进度对话框。

【讨论】:

  • @Arthur Korchagin,感谢您的完美,如果这真的有帮助,请放弃投票。
【解决方案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();
    }
}

【讨论】:

    【解决方案3】:

    我遇到了类似的问题,问题的根源是您在 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-11
      • 2019-01-19
      • 1970-01-01
      • 2012-08-13
      • 2012-08-13
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多