可以通过相应的方法设置对话框上显示的文字、图标、进度条的样式,也可以使用线程来控制进度条的显示。
先搞明白cancle()和dismiss()的区别:
cancle():取消进度条对话框;
dismiss():释放对话框,从当前窗体移除。
抱着试试看的态度翻了一下源码:
public void cancel() {
if (mCancelMessage != null) {
// Obtain a new message so this dialog can be re-used
Message.obtain(mCancelMessage).sendToTarget();
}
dismiss();
}
在cancel方法中调用了dismiss方法。
下面是Demo:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="进度条对话框"
android:textSize="30sp" />
<Button
android:id="@+id/btn_circle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:onClick="onClick"
android:textSize="30sp"
android:text="圆形进度条对话框" />
<Button
android:id="@+id/btn_long"
android:textSize="30sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:onClick="onClick"
android:text="长形进度对话框" />
</LinearLayout>
public class ProgressDialogDemo extends Activity {
private static final int DOWNLOAD_DONE = 1;
private TextView mTextView;
private ProgressDialog mProgressDialog;
private int progress;
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case DOWNLOAD_DONE:
mTextView.setText("嘿嘿,下载完成");
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progress_dialog);
mTextView = (TextView) findViewById(R.id.tv_content);
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_circle:
mProgressDialog = new ProgressDialog(this);
// 设置进度条为圆形
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
// 是否可以通过点击Back键取消
mProgressDialog.setCancelable(true);
// 设置在点击ProgressDialog外是否取消ProgressDialog进度条
mProgressDialog.setCanceledOnTouchOutside(false);
mProgressDialog.setIcon(R.drawable.ic_launcher);//
// 如果没有设置title,只设置Icon是不会显示图标的
mProgressDialog.setTitle("提示");
mProgressDialog.setButton(ProgressDialog.BUTTON_NEGATIVE, "取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mProgressDialog.cancel();
mTextView.setText("哈哈,您取消了圆形进度条对话框");
}
});
mProgressDialog.show();
mTextView.setText("哈哈,您点击了圆形进度条按钮");
break;
case R.id.btn_long:
progress = 0;
mProgressDialog = new ProgressDialog(ProgressDialogDemo.this);
// 设置长形风格进度条
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setIcon(R.drawable.ic_launcher);
mProgressDialog.setMessage("长形进度对话框");
// 设置进度条为不明确才可以在进度条上显示具体进度
mProgressDialog.setIndeterminate(false);
// 设置当前进度值
mProgressDialog.setProgress(0);
// 第二进度值
mProgressDialog.setSecondaryProgress(0);
// 最大值
mProgressDialog.setMax(100);
// 是否按返回键取消
mProgressDialog.setCancelable(true);
// 添加取消按钮 Whichbutton to set the message for, can be one of
// BUTTON_POSITIVE, BUTTON_NEGATIVE, or BUTTON_NEUTRAL
mProgressDialog.setButton(ProgressDialog.BUTTON_NEGATIVE, "取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mProgressDialog.cancel();
mTextView.setText("哈哈,您取消了长形进度条对话框");
}
});
mProgressDialog.show();
mTextView.setText("哈哈,您点击了长形进度条按钮");
// 创建线程更新进度
new Thread() {
public void run() {
while (progress <= mProgressDialog.getMax()) {
mProgressDialog.setProgress(progress += 2);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
mProgressDialog.cancel();
}
}
// 异步消息处理
mProgressDialog.cancel();
Message message = new Message();
message.what = DOWNLOAD_DONE;
handler.sendMessage(message);
};
}.start();
break;
default:
break;
}
}
}
中间出了一个小问题:在长形进度条对话框点击取消后,过一会儿,界面还是会显示“下载完成”。