最近發現Android4.0系統中ProgressDialog設置為setCancelable(true)時,點擊ProgressDialog以外的區域也可以讓ProgressDialog dismiss掉。但有時我們不希望是這樣的效果,於是將ProgressDialog設置setCancelable(false),再點擊ProgressDialog以外的區域就不會出現前面所說的情況了,然而這樣以來再按返回鍵時就不起作用了,只能等待程序執行到dissmiss處為止。其實,只要為ProgressDialog添加KeyListener來對返回鍵予以處理就可以解決這個問題了。
package cn.winfirm.examples.base; import android.app.Activity; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnKeyListener; import android.os.Bundle; import android.view.KeyEvent; import android.view.Window; /** * Activity的基類,帶一個ProgressDialog,可雙擊取消其顯示 * * @author savant * */ public class BaseActivity extends Activity { private ProgressDialog progressDialog = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); } /** * show loading progress dialog */ public void showDialog() { if (null == progressDialog) { progressDialog = ProgressDialog.show(BaseActivity.this, "", "正在加載,請稍候..."); progressDialog.setCancelable(false); } else { progressDialog.show(); } progressDialog.setOnKeyListener(onKeyListener); } /** * add a keylistener for progress dialog */ private OnKeyListener onKeyListener = new OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { dismissDialog(); } return false; } }; /** * dismiss dialog */ public void dismissDialog() { if (isFinishing()) { return; } if (null != progressDialog && progressDialog.isShowing()) { progressDialog.dismiss(); } } /** * cancel progress dialog if nesseary */ @Override public void onBackPressed() { if (progressDialog != null && progressDialog.isShowing()) { dismissDialog(); } else { super.onBackPressed(); } } }