【问题标题】:ProgressDialog is automatically dismissing after clicking any button单击任何按钮后,ProgressDialog 会自动关闭
【发布时间】:2017-02-11 04:55:26
【问题描述】:

我使用ProgressDialog 来显示一些下载状态。我添加了两个名为 CancelPaused 的按钮。

当我点击任何按钮时,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 之外单击但当用户单击任何按钮时,我不想避免关闭]

【问题讨论】:

  • 这是默认行为。您需要为此进行自定义布局
  • 使用use setCancelable(false) 将阻止用户关闭在屏幕外单击的progressDialog。
  • setCancelable(false) 没有解决他的问题,因为他想在单击属于对话框的按钮时阻止对话框关闭
  • ProgressDialog 扩展了 AlertDialog,其预期行为是在单击后立即关闭。我认为最好的方法是创建自己的自定义进度对话框扩展 DialogFragment

标签: android progressdialog dismiss


【解决方案1】:

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();
    }
});

【讨论】:

    【解决方案2】:

    这是 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() 时它仍然可以工作

    【讨论】:

    • 我已经检查了链接中的答案。但是我也遇到了一个问题,那就是:如果我想通过在框外单击来关闭ProgressDialogProgressDialog 不会被关闭。
    • 这就是为什么我说我不会推荐它。它肯定会有副作用,你已经发现了一个
    • @Sudarshan 我只是想到了另一种我认为会有所帮助的方法,我相信它不会造成任何副作用
    • 是的,它没有这样的副作用。首次单击后该按钮未关闭。但是在第一次点击之后,ProgressDialog 正在消失。 :(
    • 感谢您的回答,但无法正常工作。
    【解决方案3】:

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

    您需要在显示 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);
    

    希望这会对你有所帮助。

    【讨论】:

    • setCancelledOnTouchOutsidesetCancelable(false) 都没有解决他的问题,因为他希望在单击属于对话框的按钮时阻止对话框关闭
    • 实际上我不想避免在用户点击progressDialog之外但当用户点击任何按钮时关闭。
    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多