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