Android后退按钮和进度对话框

jwb*_*ley 34 android dialog progress button back

我有一个的AsyncTask,显示了progressDialog同时工作(它调用runOnUiThread从内部doInBackground显示进度对话框).

在运行时,我想允许使用后退按钮来取消操作; 其他人遇到此问题:当ProgressDialog正在运行时,BACK按钮不起作用

因为什么原因我不能回复那个帖子,因此不得不开始另一个?!(另一天的另一个问题)

我和Sandy有同样的想法,但是在progressDialog显示时,这段代码从未被调用过,为什么会这样?我已经在我的主要活动类中实现了它,progressDialog是否暂时将我的前景焦点从我的课程中移开?

use*_*618 45

首先,您应该显示对话框OnPreExecute,隐藏它OnPostExecute,并且 - 如有必要 - 通过发布进度来修改它.(见这里)

现在回答你的问题:ProgressDialog.show()可以OnCancelListener作为一个论点.您应该提供一个调用cancel()进度对话框实例的方法.

例:

    @Override
    protected void onPreExecute(){
        _progressDialog = ProgressDialog.show(
                YourActivity.this,
                "Title",
                "Message",
                true,
                true,
                new DialogInterface.OnCancelListener(){
                    @Override
                    public void onCancel(DialogInterface dialog) {
                        YourTask.this.cancel(true);
                        finish();
                    }
                }
        );
    }
Run Code Online (Sandbox Code Playgroud)

哪里_progressDialog是.的ProgressDialog成员YourTask.

此类在API级别26中已弃用.ProgressDialog是一个模式对话框,可防止用户与应用程序进行交互.您应该使用ProgressBar等进度指示器,而不是使用此类,可以将其嵌入到应用程序的UI中.或者,您可以使用通知来通知用户任务的进度.链接


Jah*_*hid 15

这可以通过以下代码片段来实现:

progress.setCancelable(true);
progress.setCanceledOnTouchOutside(false);
Run Code Online (Sandbox Code Playgroud)

progress是ProgressDialog对象......

这将使后退按钮关闭对话框,但阻止任何触摸输入执行此操作...


Far*_*an 13

好吧,我遇到了同样的问题.对我有用的最简单的方法是使用progressDialog.setCancelable(true)..这声明是否可以通过按后退键来取消对话框.尝试它并让我知道它是否适合你.祝好运


Ash*_*nna 8

我刚刚找到了解决这个问题的完美而简单的解决方案.有一种ProgressDialog设置KeyListener 的方法.

progressDialog.setOnKeyListener(new OnKeyListener() {
    @Override
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_BACK && !event.isCanceled()) {
            if(progressDialog.isShowing()) {
                //your logic here for back button pressed event
            } 
            return true;
        }
        return false;
    }
});
Run Code Online (Sandbox Code Playgroud)

它工作得很好setCancelable(false).我也在检查event.isCanceled(),因为没有我,我得到两个事件.我在带有和没有硬件键的Lollipop设备上进行了测试.


Kev*_*vin 5

像取消一样处理后退按钮不是正确的方法.
当用户触摸对话框外部的屏幕时,也会发生取消.你想区分这两个动作,不是吗?

正确的方法是扩展ProgressDialog类并覆盖onBackPressed方法.

private class SubProgressDialog extends ProgressDialog {
    public SubProgressDialog(Context context) {
        super(context);
    }
    @Override
    public void onBackPressed() {
        /** dismiss the progress bar and clean up here **/
    }
}


public void displayProgressBar(){
    progressBar = new SubProgressDialog(this);
    progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    progressBar.setCancelable(false);
    progressBar.setMessage(getString(R.string.authorizing));        
    progressBar.show();   
    new Thread(new Runnable() {
      public void run() {
      }
       }).start();     
Run Code Online (Sandbox Code Playgroud)

}

注意setCancelable(false),再次强调后退按钮与简单取消不同.
此外,这将有效地忽略来自用户的任何其他触摸输入.