Android:关闭时进度对话框弹出

3
我已经制作了一个Util类来打开和关闭进度对话框,代码如下:

Utils.java

public class Utils {

    private static Utils util;
    private Typeface typeface;
    private ProgressDialog progressDialog;

    public static Utils getInstance(){

        if(util == null){
            util = new Utils();
        }
        return util;
    }

    public void showProgressDialog(Activity activity){

        if(progressDialog != null && progressDialog.isShowing()){
            return;
        }

        if(progressDialog == null ) {
            progressDialog = new ProgressDialog(activity);
        }
        progressDialog.setMessage("Loading...");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setCancelable(false);
        progressDialog.show();
     }

public void closeProgressDialog(){
    try {
        if (progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    }catch(Exception e){
        e.printStackTrace();
    }
  }
}

在加载数据之前,我会调用showProgressDialog,在数据加载完成后会关闭它。代码如下:

Activity 代码

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_dashboard,container,false);
    activity = getActivity();
    ButterKnife.bind(this,view);

    init();
    return view;
}

  private void init() {

    Utils.getInstance().showProgressDialog(activity);
    getPatientsList();


   //in response i am calling closeProgressDialog();
  }

 public void onPatientListResponse(String response){
         Utils.getInstance().closeProgressDialog(); // raises exception here
  }

但是在 closeProgressDialog() 中引发了异常。

java.lang.IllegalArgumentException: View=com.android.internal.policy.PhoneWindow$DecorView{f7fd12e V.E...... R......D 0,0-1024,232} not attached to window manager
4个回答

2

试试这个方法:

无论如何,您都需要检查进度对话框是否已经显示,如果是,则只需返回控制权。相反,解除 progressDialog 并创建一个新实例。因为旧的 progressDialog 可能已经使用了不同的上下文。

public void showProgressDialog(Activity activity){

        if(progressDialog != null && progressDialog.isShowing()){
            progressDialog.dismiss();
            progressDialog = null;
        }

        if(progressDialog == null ) {
            progressDialog = new ProgressDialog(activity);
        }
        progressDialog.setMessage("Loading...");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setCancelable(false);

        if(!activity.isFinishing())
           progressDialog.show();
     }

1
非常感谢。实际上,在之前的活动中,我在调用新活动之前没有调用closeProgressDialog()。因此,在调用showProgressDialog()时,它只返回了先前的对话框。所以对话框是在之前的活动中打开的,而我在新活动中调用了closedialog。非常感谢! - Rajesh Gosemath
现在我确保在离开活动或片段之前调用closedialog。 - Rajesh Gosemath
@Androidjack 很高兴能帮到你 :) - Raghavendra

1
 public void showProgressDialog(Activity activity){

        if(progressDialog != null){  // Ensure it's not null
          if(progressDialog.isShowing()) // if it's showing than return.
            return;
        }else{
          //It will create an instance of new object.
            progressDialog = new ProgressDialog(activity);
        }

        progressDialog.setMessage("Loading...");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setCancelable(false);
        progressDialog.show();
     }

@Raghavendra 不,他已经检查了非空,然后再检查isVisible,我还单独分离了一个null条件以确保它不是null。 - QuokMoon
我认为你已经知道了,在if条件语句中,如果有两个条件,如果第一个条件失败了,它就不会检查第二个条件,对于这种情况,他所做的看起来对我来说是正确的。 - Raghavendra
是的,这种情况永远不会发生。还有一个添加的部分是else,为了初始化ProgressDialog对象,因为他们已经提到(progressDialog == null)创建对象,这似乎很奇怪。 - QuokMoon

0

我之前遇到过这个问题,并使用以下代码解决了。

private boolean isDialogViewAttachedToWindowManager() {
    if (dialog.getWindow() == null) return false;
    View decorView = progressDialog.getWindow().getDecorView();
    return decorView != null && decorView.getParent() != null;
}

或者尝试下面的解决方案。

if (pDialog instanceof Activity && !((Activity) mContext).isFinishing())
        pDialog.show();

0

你甚至还没有初始化进度条,就想着去检查它是否正在显示...

这里你没有初始化进度条,但是因为你的条件是&&(与),编译器会去检查两个条件,发现progressDialog为空,因此它没有isShowing方法...

if(progressDialog != null && progressDialog.isShowing()){
        return;
    }
--------------------------------------------------
public void showProgressDialog(Activity activity){
    if(progressDialog == null ) {
        progressDialog = new ProgressDialog(activity);
    }
    progressDialog.setMessage("Loading...");
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    progressDialog.setCancelable(false);
    progressDialog.show();
 }

一个建议是使用Context而不是Activity来控制你的进度条。
祝好!

我在哪里没有初始化它? - Rajesh Gosemath
是的,但我已经检查过了,它没有抛出异常。 - Rajesh Gosemath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接