ProgressDialog使用總結

小鴻洋發表於2018-09-07

ProgressDialog的使用 

ProgressDialog 繼承自AlertDialog,AlertDialog繼承自Dialog,實現DialogInterface介面。

 

ProgressDialog的建立方式有兩種,一種是new Dialog ,一種是呼叫Dialog的靜態方法Dialog.show()。

 

      


 
  1. // 方式一:new Dialog

  2. final ProgressDialog dialog = new ProgressDialog(this);

  3. dialog.show();

 

 

 


 
  1. // 方式二:使用靜態方式建立並顯示,這種進度條只能是圓形條,設定title和Message提示內容

  2. ProgressDialog dialog2 = ProgressDialog.show(this, "提示", "正在登陸中");

 


 
  1. // 方式三 使用靜態方式建立並顯示,這種進度條只能是圓形條,這裡最後一個引數boolean indeterminate設定是否是不明確的狀態

  2. ProgressDialog dialog3 = ProgressDialog

  3. .show(this, "提示", "正在登陸中", false);

 


 
  1. // 方式四 使用靜態方式建立並顯示,這種進度條只能是圓形條,這裡最後一個引數boolean cancelable 設定是否進度條是可以取消的

  2. ProgressDialog dialog4 = ProgressDialog.show(this, "提示", "正在登陸中",

  3. false, true);

 

 


 
  1. // 方式五 使用靜態方式建立並顯示,這種進度條只能是圓形條,這裡最後一個引數 DialogInterface.OnCancelListener

  2. // cancelListener用於監聽進度條被取消

  3. ProgressDialog dialog5 = ProgressDialog.show(this, "提示", "正在登陸中", true,

  4. true, cancelListener);

方式五中需要一個cancelListener,程式碼如下;


 
  1. private OnCancelListener cancelListener = new OnCancelListener() {

  2.  
  3. @Override

  4. public void onCancel(DialogInterface dialog) {

  5. // TODO Auto-generated method stub

  6. Toast.makeText(MainActivity.this, "進度條被取消", Toast.LENGTH_LONG)

  7. .show();

  8.  
  9. }

  10. };


 

 


ProgressDialog的樣式有兩種,一種是圓形不明確狀態,一種是水平進度條狀態

 

第一種方式:圓形進度條

 


 
  1. final ProgressDialog dialog = new ProgressDialog(this);

  2. dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);// 設定進度條的形式為圓形轉動的進度條

  3. dialog.setCancelable(true);// 設定是否可以通過點選Back鍵取消

  4. dialog.setCanceledOnTouchOutside(false);// 設定在點選Dialog外是否取消Dialog進度條

  5. dialog.setIcon(R.drawable.ic_launcher);//

  6. // 設定提示的title的圖示,預設是沒有的,如果沒有設定title的話只設定Icon是不會顯示圖示的

  7. dialog.setTitle("提示");

  8. // dismiss監聽

  9. dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {

  10.  
  11. @Override

  12. public void onDismiss(DialogInterface dialog) {

  13. // TODO Auto-generated method stub

  14.  
  15. }

  16. });

  17. // 監聽Key事件被傳遞給dialog

  18. dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {

  19.  
  20. @Override

  21. public boolean onKey(DialogInterface dialog, int keyCode,

  22. KeyEvent event) {

  23. // TODO Auto-generated method stub

  24. return false;

  25. }

  26. });

  27. // 監聽cancel事件

  28. dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {

  29.  
  30. @Override

  31. public void onCancel(DialogInterface dialog) {

  32. // TODO Auto-generated method stub

  33.  
  34. }

  35. });

  36. //設定可點選的按鈕,最多有三個(預設情況下)

  37. dialog.setButton(DialogInterface.BUTTON_POSITIVE, "確定",

  38. new DialogInterface.OnClickListener() {

  39.  
  40. @Override

  41. public void onClick(DialogInterface dialog, int which) {

  42. // TODO Auto-generated method stub

  43.  
  44. }

  45. });

  46. dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",

  47. new DialogInterface.OnClickListener() {

  48.  
  49. @Override

  50. public void onClick(DialogInterface dialog, int which) {

  51. // TODO Auto-generated method stub

  52.  
  53. }

  54. });

  55. dialog.setButton(DialogInterface.BUTTON_NEUTRAL, "中立",

  56. new DialogInterface.OnClickListener() {

  57.  
  58. @Override

  59. public void onClick(DialogInterface dialog, int which) {

  60. // TODO Auto-generated method stub

  61.  
  62. }

  63. });

  64. dialog.setMessage("這是一個圓形進度條");

  65. dialog.show();

  66. new Thread(new Runnable() {

  67.  
  68. @Override

  69. public void run() {

  70. // TODO Auto-generated method stub

  71. try {

  72. Thread.sleep(5000);

  73. // cancel和dismiss方法本質都是一樣的,都是從螢幕中刪除Dialog,唯一的區別是

  74. // 呼叫cancel方法會回撥DialogInterface.OnCancelListener如果註冊的話,dismiss方法不會回掉

  75. dialog.cancel();

  76. // dialog.dismiss();

  77. } catch (InterruptedException e) {

  78. // TODO Auto-generated catch block

  79. e.printStackTrace();

  80. }

  81.  
  82. }

  83. }).start();


其中通過Thread.sleep(5000)模擬後臺操作。

 

cancel和dismiss方法本質都是一樣的,都是從螢幕中刪除Dialog,唯一的區別是:呼叫cancel方法會回撥DialogInterface.OnCancelListener如果註冊的話,dismiss方法不會回掉。

 

 第二種方式:水平進度條

 


 
  1. // 進度條還有二級進度條的那種形式,這裡就不演示了

  2. final ProgressDialog dialog = new ProgressDialog(this);

  3. dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);// 設定水平進度條

  4. dialog.setCancelable(true);// 設定是否可以通過點選Back鍵取消

  5. dialog.setCanceledOnTouchOutside(false);// 設定在點選Dialog外是否取消Dialog進度條

  6. dialog.setIcon(R.drawable.ic_launcher);// 設定提示的title的圖示,預設是沒有的

  7. dialog.setTitle("提示");

  8. dialog.setMax(100);

  9. dialog.setButton(DialogInterface.BUTTON_POSITIVE, "確定",

  10. new DialogInterface.OnClickListener() {

  11.  
  12. @Override

  13. public void onClick(DialogInterface dialog, int which) {

  14. // TODO Auto-generated method stub

  15.  
  16. }

  17. });

  18. dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",

  19. new DialogInterface.OnClickListener() {

  20.  
  21. @Override

  22. public void onClick(DialogInterface dialog, int which) {

  23. // TODO Auto-generated method stub

  24.  
  25. }

  26. });

  27. dialog.setButton(DialogInterface.BUTTON_NEUTRAL, "中立",

  28. new DialogInterface.OnClickListener() {

  29.  
  30. @Override

  31. public void onClick(DialogInterface dialog, int which) {

  32. // TODO Auto-generated method stub

  33.  
  34. }

  35. });

  36. dialog.setMessage("這是一個水平進度條");

  37. dialog.show();

  38. new Thread(new Runnable() {

  39.  
  40. @Override

  41. public void run() {

  42. // TODO Auto-generated method stub

  43. int i = 0;

  44. while (i < 100) {

  45. try {

  46. Thread.sleep(200);

  47. // 更新進度條的進度,可以在子執行緒中更新進度條進度

  48. dialog.incrementProgressBy(1);

  49. // dialog.incrementSecondaryProgressBy(10)//二級進度條更新方式

  50. i++;

  51.  
  52. } catch (Exception e) {

  53. // TODO: handle exception

  54. }

  55. }

  56. // 在進度條走完時刪除Dialog

  57. dialog.dismiss();

  58.  
  59. }

  60. }).start();


 

 

更多的是使用自定義的ProgressDialog,以滿足不同顯示的需要。