Android后退按钮和进度对话框

Android后退按钮和进度对话框,android,button,dialog,progress,back,Android,Button,Dialog,Progress,Back,我有一个AsyncTask,它在工作时显示一个进度对话框(它从doInBackground中调用runOnUiThread以显示进度对话框) 在其运行期间,我希望允许使用后退按钮取消操作;其他人有此问题: 因为什么原因我不能回复那个帖子,所以不得不开始另一个?!(另一天的另一个问题) 我和Sandy有相同的想法,但是在progressDialog显示时从未调用此代码,这是为什么?我已经在我的主活动类中实现了它,progressDialog是否会暂时将前台焦点从我的类中移除?首先,您应该从OnPr

我有一个AsyncTask,它在工作时显示一个进度对话框(它从doInBackground中调用runOnUiThread以显示进度对话框)

在其运行期间,我希望允许使用后退按钮取消操作;其他人有此问题:

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


我和Sandy有相同的想法,但是在progressDialog显示时从未调用此代码,这是为什么?我已经在我的主活动类中实现了它,progressDialog是否会暂时将前台焦点从我的类中移除?

首先,您应该从
OnPreExecute
显示对话框,将其隐藏在
OnPostExecute
中,如果需要,还可以通过发布进度对其进行修改。(见附件)

现在回答您的问题:
ProgressDialog.show()
可以将
OnCancelListener
作为参数。您应该在progress dialog实例上提供一个调用
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();
                    }
                }
        );
    }
其中
\u progressDialog
YourTask
progressDialog
成员

该类在API级别26中被弃用。ProgressDialog是一个模态 对话框,该对话框阻止用户与应用程序交互。相反 在使用此类时,您应该使用一个进度指示器,如 ProgressBar,可嵌入应用程序的UI中。或者, 您可以使用通知通知用户任务的进度


爪哇岛。。。我使用标准技术asyncTask和ProgressDialog测试了您的场景。在我的测试中,当progressDialog显示并且我回击时,progressDialog被取消,后台线程继续运行。我不知道你为什么要打电话给runOnUiThread

因此:

在onPreExecute中显示进度对话框 将长时间运行的任务放在doInBackground中 关闭onPostExecute中的progressDialog 将输入参数传递给长时间运行的任务,如中所示:

new MyAsynch().execute(password,inString);
取消()onPause中的asynchTask和progressDialog

protected void onPause() {
    super.onPause();
    if (asynch != null) {asynch.cancel(true);}
    if (progress != null){progress.cancel();}
}
日航


我有一些代码。

嗯,我也有同样的问题。对我来说最简单的方法是使用
progressDialog.setCancelable(true)
。。这将声明是否可以通过按back键取消对话框。。试试看,让我知道它是否适合你。祝你好运

把后退按钮当作取消按钮不是正确的方法。
当用户触摸对话框外的屏幕时,也会发生取消。 你想区分这两种行为,不是吗

正确的方法是扩展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();     
}

请注意setCancelable(false),再次强调后退按钮与简单的取消按钮不同。

此外,这将有效地忽略来自用户的任何其他触摸输入。

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

progress.setCancelable(true);
progress.setCanceledOnTouchOutside(false);
进度是ProgressDialog对象


这将启用“后退”按钮来关闭对话框,但阻止任何触摸输入来关闭对话框…

以下是我的解决方案。PD问题仅在应用程序退出“后退”按钮时发生(通常是用户反复按下该按钮时,有时(并非所有时候)才会发生)当应用程序已经销毁时,会调用PD。由于某些原因,取消PD
onDestroy
不起作用,并且当我尝试它时,每次按后退按钮都会关闭应用程序,尽管
canGoBack()
设置为true。相反,我会在
goBack
上取消PD,这是首先导致碰撞的事件,我会在
finish()
之前完成。如果应用程序在goBack上正常退出,那么一开始就没有问题

顺便说一句,“差异”旨在让用户通过快速双击(两次点击之间间隔400毫秒)退出应用程序,而不是从一页回到另一页

希望它能帮助别人

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        switch (keyCode) {
        case KeyEvent.KEYCODE_BACK:
            difference = System.currentTimeMillis() - startTime;
            if (wView.canGoBack() && difference > 400) {
                wView.goBack();
            } else {
                dismissProgressDialog();
                finish();
            }
            startTime = System.currentTimeMillis();
            return true;
        }
    }
    return super.onKeyDown(keyCode, event);
}


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

请按照此操作,它显示“取消”按钮仅异步,单击“取消”按钮将调用finish

protected void onPreExecute() {


        dialogx.setMessage("Loading... Please Wait...");
        dialogx.setCancelable(false);
        dialogx.setButton(DialogInterface.BUTTON_NEGATIVE,
                "Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

                dialogx.dismiss();
                GetDataTask.this.cancel(true);
                finish();
            }
        });
        dialogx.show();


    }

复制下面的代码并粘贴到异步任务中非常简单

进程对话

@Override
protected void onPreExecute() {

    dialog = new ProgressDialog(MainActivity.this) {
        @Override
        public void onBackPressed() {
            dialog.cancel();
            dialog.dismiss();
        }
    };
    // dialog.setTitle("file is..");//its optional If u want set title in progress
    // bar
    dialog.setMessage("Loading file....");
    dialog.setCancelable(false);

    dialog.show();

}

我刚刚找到了一个完美且最简单的解决方案。在
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;
    }
});

它在
setCancelable(false)
中运行良好。我还在检查
event.isCanceled()
,因为没有这一点,我得到了两个事件。我在棒棒糖设备上测试了这一点,有硬件键和没有硬件键。

嗯,我看到我可以在backpressed上运行,但再次强调,这仅在progressDialog未运行时调用。如果我将progressDialog设置为cancelable,可能我可以覆盖一个“onCancel”方法(如果有一个),这就是原因我发现了。我自己做了更多的研究,加上你给出的答案,我利用你的建议使它发挥了作用:)是的,这正是我想要的。通过一个可中断的进度对话使其正常工作:)Hi Farhan,根据用户634618的建议,我使用了onCancelListener():DNo无需子类ProgressDialog,实现onCancelListener并使用ProgressDialog.SetCanceledOnTouchOut(false);为了得到同样的效果。