在Android中,可以使用ProgressDialog来显示进度对话框,并提供取消选项。下面是一个示例代码:
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button btnShowProgressDialog;
private ProgressDialog progressDialog;
private MyTask myTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnShowProgressDialog = findViewById(R.id.btn_show_progress_dialog);
btnShowProgressDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showProgressDialog();
}
});
}
private void showProgressDialog() {
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Loading...");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setCancelable(true);
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.setMax(100);
progressDialog.setProgress(0);
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (myTask != null && myTask.getStatus() == AsyncTask.Status.RUNNING) {
myTask.cancel(true);
}
}
});
progressDialog.show();
myTask = new MyTask();
myTask.execute();
}
private class MyTask extends AsyncTask {
@Override
protected Void doInBackground(Void... voids) {
for (int i = 0; i <= 100; i++) {
if (isCancelled()) {
break;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(i);
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
int progress = values[0];
progressDialog.setProgress(progress);
}
@Override
protected void onPostExecute(Void aVoid) {
progressDialog.dismiss();
}
@Override
protected void onCancelled() {
progressDialog.dismiss();
}
}
}
在上面的代码中,首先在布局文件中添加一个Button,然后在MainActivity中找到该Button,并设置点击事件。点击按钮后,调用showProgressDialog()方法显示进度对话框。
showProgressDialog()方法中,首先创建一个ProgressDialog对象,并设置一些属性,如消息、样式、最大进度等。然后设置取消按钮的点击事件,当点击取消按钮时,如果异步任务myTask正在运行,则调用myTask.cancel(true)取消任务。
接下来,创建一个继承自AsyncTask的内部类MyTask。在该类中,实现doInBackground()方法来执行后台任务,使用publishProgress()方法来更新进度。在onProgressUpdate()方法中,更新ProgressDialog的进度。在onPostExecute()方法和onCancelled()方法中,分别在任务完成或被取消时关闭ProgressDialog。
需要注意的是,AsyncTask是一个抽象类,需要继承并实现其方法。在doInBackground()方法中执行耗时操作,通过publishProgress()方法更新进度。在onProgressUpdate()方法中更新UI,如更新ProgressDialog的进度。在onPostExecute()方法中执行任务完成时的操作,如关闭ProgressDialog。在onCancelled()方法中执行任务被取消时的操作,如关闭ProgressDialog。
以上就是在Android中显示进度对话框并提供取消选项的解决方法。