单击任何按钮后 ProgressDialog 自动关闭

ProgressDialog is automatically dismissing after clicking any button

我正在使用ProgressDialog 来显示一些下载状态。我添加了两个名为 Cancel & Paused.

的按钮

当我点击任何按钮时,ProgressDialog 被取消,但我需要 ProgressDialog 不被自动取消,因为我必须处理一些其他事情。

我的代码是:

ProgressDialog progressDialog;
progressDialog = new ProgressDialog(this);
progressDialog.setTitle("Please Wait..");
progressDialog.setMessage("Downloading");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(100);
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            Toast.makeText(MainActivity.this, "Canceled", Toast.LENGTH_SHORT).show();
        }
    });
progressDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Paused", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {


           // DownloadManager.getInstance().pause(fileUrl);
            Toast.makeText(MainActivity.this, "Paused", Toast.LENGTH_SHORT).show();\
        }
    });

progressDialog.show();

问题出在哪里? [注意:我不想在用户单击 progressDialog 之外但在用户单击任何按钮时避免关闭]

好的,我明白了……并更新我的答案……

您需要在 ProgressDialog 显示后设置 onClickListener

myDialog = new ProgressDialog(this);

myDialog.setCancelable(false);
myDialog.setCanceledOnTouchOutside(false);

// Create the button but set the listener to a null object.
myDialog.setButton(DialogInterface.BUTTON_NEUTRAL, "start", 
    (DialogInterface.OnClickListener) null )

// Show the dialog so we can then get the button from the view.
myDialog.show();

// Get the button from the view.
Button dialogButton = myDialog.getButton( 
DialogInterface.BUTTON_NEUTRAL );

// Set the onClickListener here, in the view.
dialogButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick ( View view ) {

        if (isPrepared) {
             myDialog.dismiss();

        }

        // Dialog will not get dismissed unless "isPrepared".

    }

});

使用 setCanceledOnTouchOutside 在点击屏幕的任意位置停止对话框关闭

dialog.setCanceledOnTouchOutside(false);

使用 setCancelable 在单击硬件后退按钮时关闭对话框

dialog.setCancelable(false);

希望对您有所帮助。

这是 ProgressDialog 的默认行为。您可以尝试 ProgressDialog: How to prevent automatic dismissing of Dialog inside setButton-Listener? 中描述的方法(我不推荐这种方法)或制作自定义布局。

编辑:

在我们讨论的同时,我可以建议另一种非正统的方法。

覆盖 dismiss() :

public class MyProgressDialog extends ProgressDialog {

public boolean close = true;

@Override
public void dismiss() {
    if (close) {
        super.dismiss();
    } else {
        close = true;
    }
}

在您的按钮点击中,首先将 close 设置为 false。

请注意,else 子句使其成为一次性的事情,以便下次代码的另一部分调用时 dismiss() 它仍然有效

progressDialog.show() 之后获取按钮并设置 View.OnClickListener 以处理那里的点击。

ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setTitle("Please Wait..");
progressDialog.setMessage("Downloading");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(100);
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel",
        (DialogInterface.OnClickListener) null);
progressDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Pause",
        (DialogInterface.OnClickListener) null);
progressDialog.show();

progressDialog.getButton(DialogInterface.BUTTON_NEGATIVE)
        .setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // Handle "Cancel" button click here
        Toast.makeText(MainActivity.this, "Canceled", Toast.LENGTH_SHORT).show();
    }
});
progressDialog.getButton(DialogInterface.BUTTON_POSITIVE)
        .setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // Handle "Pause" button click here
        Toast.makeText(MainActivity.this, "Paused", Toast.LENGTH_SHORT).show();
    }
});