dialog 译文

来源:互联网 发布:取什么淘宝店铺名大全 编辑:程序博客网 时间:2024/04/28 23:19

http://blog.csdn.net/akon_vm/article/details/7429979  出处

一个dialog通常是指出现在当前Activity前面的小窗口,当dialog出现后,被它部分遮盖的Activity将失去焦点,一切的用户操作交由这个dialog处理。

Android API支持以下类型的Dialog对象:

AlertDialog -- 允许你在其上添加0、1、2或3个button,而且它还可以包含一个提供了可选项(如checkboxes或radio buttons等)的列表。正确的使用AlertDialog可以构建大多数Dialog界面。

ProgressDialog -- 用于显示一个progress wheel或者一个progress bar。ProgressDialog是一个别扩展了的AlertDialog,所以它自然也允许你在其上添加button。

DatePickerDialog -- 允许用户选择时间的dialog。

TimePickerDialog -- 允许用户选择时间的dialog。

如何显示一个Dialog

一个dialog常常作为一个Activity的一部分被创建和显示。你应该在你创建的Activity的 onCreateDialog(int)这个回调函数中创建dialog。当你使用这个回调函数,Android系统就会自动管理每个dialog的状态并且创建每个dialog和对应Activity之间的连接,使对应的Activity成为对应dialog的“owner”。这样,每个dialog就从Activity继承了某些属性。例如,当一个dialog处于open状态时,用户按下Menu键就会显示你为这个Activity定义的menu。

注意:如果你决定在onCreateDialog()外面创建一个dialog,Android系统不会把它“粘贴” 到某个Activity上。如果需要,你可以使用setOwnerActivity(Activity)方法将一个dialog“粘贴”到一个 Activity上。

当你想要显示一个dialog时,请调用showDialog(int)方法,并且传递给它一个能唯一标识你想要显示的dialog的整数。

当一个dialog第一次被请求的时候,Android系统会呼叫你的Activity中的 onCreateDialog(int)方法,你要在这个方法体里实例化一个Dialog。onCreateDialog和showDialog一样,都需要你传递给它们一个dialog ID。在你创建完一个Dialog对象后,请让onCreateDialog方法返回一个Dialog对象的引用。

在dialog被显示之前,Android也会呼叫onPrepareDialog(int, Dialog)。这个方法是可选的,如果你想在每次打开dialog时改变它任何树形,你就需要定义这个方法。每次dialog别打开时,Android 都会呼叫onPrepareDialog(int, Dialog),而只有当dialog是被第一次打开时才呼叫onCreateDialog(int)。如果你比重写

onPrepareDialog(int, Dialog),dialog就会呈现用户上一次打开它时的状态。这个方法也需要你传递给它一个dialog的ID,同时还需要你传递给它一个你使用 onCreateDialog()方法创建并返回的Dialog对象的引用。

最好的定义 onCreateDialog(int)和onPrepareDialog(int, Dialog) 这两个回调函数的方法是使用switch语句检测被传入的id实参。每个case应该检测一个惟一的dialog ID,然后创建和定义各自的Dialog对象。例如,假设需要两个不同对话框的一个游戏程序,一个对话框指示这个游戏已被暂停,两一个指示游戏结束。

首先,为每个dialog定义一个ID:

view plaincopy to clipboardprint?

static final int DIALOG_PAUSE_ID = 0;

static final int DIALOG_GAMEOVER_ID = 1;

static final int DIALOG_PAUSE_ID = 0;

static final int DIALOG_GAMEOVER_ID = 1;

然后,定义onCreateDialog(int)方法,其中应该包含用于区别不同dialog ID的switch语句:

[java] view plaincopy
  1. protected Dialog onCreateDialog(int id) {  
  2.     Dialog dialog;  
  3.     switch(id) {  
  4.     case DIALOG_PAUSED_ID:  
  5.         // do the work to define the pause Dialog  
  6.         break;  
  7.     case DIALOG_GAMEOVER_ID:  
  8.         // do the work to define the game over Dialog  
  9.         break;  
  10.     default:  
  11.         dialog = null;  
  12.     }  
  13.     return dialog;  
  14. }  


注意:在以上例子中,在case分支语句中并没有代码,因为本节还没有讲述定义Dialog的处理过程。

接下来,是时候去显示一个dialog了,请调用showDialog(int),并传递给它一个dialog的ID。

showDialog(DIALOG_PAUSED_ID);

showDialog(DIALOG_PAUSED_ID);

如何让一个Dialog消失

当你打算关闭一个dialog,可以调用Dialog对象成员方法dismiss()方法来打发它。如果有必要,你可以从为你呼叫dismiss()的Activity中调用dismisDialog(int)。

如果你正在使用onCreateDialog(int)去管理dialog的状态,那每次你的dialog消失后,Activity就持有Dialog对象的状态信息。如果你真的不再需要这个Dialog对象,或者你真的需要清除这个状态,那你应该呼叫 removeDialog(int)。这个方法会擦除所有与这个对象相关的内部引用,并且如果dialog正在被显示,这个方法会dismiss这个 dialog。

如何使用dismiss监听器

如果你想让你的应用程序在dialog消失的过程中做一些事,你就应该为你的Dialog绑定一个on-dismiss监听器。

首先,定义DialogInterface.OnDismissListener接口。这个接口只有一个方法—— onDismiss(DialogInterface),在dialog消失后,系统就会呼叫这个方法。然后把你的实现了 OnDismissListener接口的对象传递给setOnDismissListener()。

然后,值得注意的是dialog也能够够取消(be cancelled)。这是一种标识dialog被用户显示取消的特殊情况。当用户按下了返回键或者关闭了这个dialog或者应用程序员显示的调用了 cannel()时(可能在dialog中的“Cancel”按钮被按下的处理方法中调用的),就会发生这种情况。当一个dialog处在被取消的状态,OnDismissListener也会接收到来自Android的通知,但如果你想Android在这个dialog被显示取消(and not dismissed normally),就得使用setOnCancelListener()方法注册一个 DialogInterface.OnCancelListener。

如何创建一个AlertDialog

AlertDialog是Dialog类的扩展类,它可以构建很多中dialog用户界面,Android也建议应用程序员使用AlertDialog完成dialog用户界面的构建。你可以用它构建具有任何一下属性的dialog:

A title

A text message

One, two, or three buttons

A list of selectable items(with optional checkboxes or radio buttons)

为了创建一个AlertDialog,你需要使用AlertDialog.Builder子类。使用 AlertDialog.Builder(Context)获得一个Builder,然后使用类的公开方法去定义AlertDialog的所有属性。在你已经完成了对Builder的操作后,呼叫create()方法取回这个AlertDialog对象。

以下内容论述和展示了如何使用AlertDialog.Builder类,定义AlertDialog的各种属性。如果你在onCreateDialog()回调函数中使用下面任何一段代码,你就可以返回你想要显示的具有某些属性的目标Dialog对象。

添加button

如果你想构建一个带有button的dialog,需要调用set...Button()方法。

[java] view plaincopy
  1. AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  2. builder.setMessage("Are you sure you want to exit?")  
  3.        .setCancelable(false)  
  4.        .setPositiveButton("Yes"new DialogInterface.OnClickListener() {  
  5.            public void onClick(DialogInterface dialog, int id) {  
  6.                 MyActivity.this.finish();  
  7.            }  
  8.        })  
  9.        .setNegativeButton("No"new DialogInterface.OnClickListener() {  
  10.            public void onClick(DialogInterface dialog, int id) {  
  11.                 dialog.cancel();  
  12.            }  
  13.        });  
  14. AlertDialog alert = builder.create();  

首先,呼叫setMessage(CharSequence)为dialog添加一条提示消息。然后,开始 method-chaining并且呼叫setCancelable(boolean)函数设置这个dialog为不可取消(用户就不能通过按返回键关闭这个dialog)。使用set...Button()方法添加button,例如,使用接收在button上显示的字符串和对用户按下按钮动作进行处理的DialogInterface.OnClickListener这两个参数的setPositiveButton()方法为dialog添加一个按钮。

注意:不可以在一个dialog上同时添加两个“positive” button。最多可以在一个dialog上添加三个button:positive, neutral, and negative button。

添加列表:

使用setItems()方法为AlertDialog添加一个可供用户选择的列表。

[java] view plaincopy
  1. final CharSequence[] items = {"Red""Green""Blue"};  
  2.   
  3. AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  4. builder.setTitle("Pick a color");  
  5. builder.setItems(items, new DialogInterface.OnClickListener() {  
  6.     public void onClick(DialogInterface dialog, int item) {  
  7.         Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();  
  8.     }  
  9. });  
  10. AlertDialog alert = builder.create();  


 

首先,调用setTitle(CharSequence)为dialog添加一个title。然后,调用 setItems()为dialog添加一个list,这个list接收一组items以显示,并且 DialogInterface.OnClickListener对用户的不同选择进行处理。

添加checkboxes和radio buttons

为了创建带有multiple-choice items(checkboxes)或single-choice items(radio buttons)的dialog,需要分别使用setMultiChoiceItems()和setSingleChoiceItems()方法。如果你是在onCreateDialog创建这些可选list,Android就会为你管理这个list的状态。只要这个Activity是active的,这个dialog就会记住之前被用户选中的items,但当用户离开当前Activity,the selection 就会丢失。

注意:为了在用户离开或者暂停Activity时保存selection,在整个Activity的生命周期中,你一定要在的适当的时候sava和restore

the setting。如果想要永久保存the selections,就需要使用数据存储技术保存这些setting.

要创建一个带有single-choice items的AlertDialog,可以使用创建带有lists的AlertDialog的代码段,但是,需要用setSingleChoiceItems()代替setItems()。

[java] view plaincopy
  1. final CharSequence[] items = {"Red""Green""Blue"};  
  2.   
  3. AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  4. builder.setTitle("Pick a color");  
  5. builder.setSingleChoiceItems(items, -1new DialogInterface.OnClickListener() {  
  6.     public void onClick(DialogInterface dialog, int item) {  
  7.         Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();  
  8.     }  
  9. });  
  10. AlertDialog alert = builder.create();  


 

setSingleChoiceItems()的第二个参数是一个整数值,指示默认默认选中哪个list(zero-based),使用“-1”指示默认情况下不应该选中任何item。

 

创建ProgressDialog

一个ProcessDialog是一个扩展了的AlertDialog类,一个实例化了ProcessDialog的dialog能够显示一个一个进度条,同时也能够提供buttons,例如取消下载的button。

只要呼叫ProgressDialog.show()就可以打开一个progress dialog。

ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "",

"Loading. Please wait...", true);

第一个参数是该应用程序的Context,第二个参数是这个dialog的title(留白),第三个参数是显示在dialog上的字符串,最后一个参数标识这个progress是否是indeterminate(这只和进度条的创建相关,我们将在一下节中讨论)。

进度dialog的默认方格是将进度显示为一个圆环。如果你要创建一个可以显示下载进程的进度条,请阅读一下内容。

显示进度条

要想显示带有动态进度信息的进度条,你需要:

1. 调用ProgressDialog(Context)这个构造函数初始化ProgressDialog。

2. 调用setProgressStyle(int)将进度条的风格设置为STYLE_HORIZONTAL。当然,你也可以给这个dialog设置其它属性,例如在它上面显示一条消息。

3. 当你准备好去显示一个dialog了,可以调用show()方法,或者从onCreateDialog(int)这个回调方法中返回ProgressDialog。

4. 你可以调用并传递一个目前总完成百分比的整数值给setProgress(int),或者调用并传递一个你想要加到目前已完成百分比的整数值给incrementProgressBy(int)。

例如,你可能像这样创建ProgressDialog。

[java] view plaincopy
  1. ProgressDialog progressDialog;  
  2. progressDialog = new ProgressDialog(mContext);  
  3. progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
  4. progressDialog.setMessage("Loading...");  
  5. progressDialog.setCancelable(false);  


大多数创建progress dialog的代码都会同时创建一个用于更新这个progress dialog的线程。为了完成更新progress dialog的任务,你需要在你的应用程序中再开启一个线程,然后使用Handler对象向Activity的UI线程传递进度信息。如果你还没有熟练使用带有Handler的新加线程,请看下面的新启一个线程更新progress dialog的例子。

包含新启线程的ProgressDialog

这个例子使用一个新启动的线程跟踪进度(实际上只是将数值累加到100)信息,每当有了新的进度,这个新启的线程就使用Handler向主Activity发送一条Message,然后主Acitvity就会更新ProgressDialog。

[java] view plaincopy
  1. package org.vhow.android.ui.dialogs;  
  2.   
  3.   
  4. import android.app.Activity;  
  5.   
  6. import android.app.Dialog;  
  7.   
  8. import android.app.ProgressDialog;  
  9.   
  10. import android.os.Bundle;  
  11.   
  12. import android.os.Handler;  
  13.   
  14. import android.os.Message;  
  15.   
  16. import android.util.Log;  
  17.   
  18. import android.view.View;  
  19.   
  20. import android.view.View.OnClickListener;  
  21.   
  22. import android.widget.Button;  
  23.   
  24. public class Dialogs extends Activity  
  25.   
  26. {  
  27.   
  28. static final int PROGRESS_DIALOG = 0;  
  29.   
  30. Button button;  
  31.   
  32. ProgressThread progressThread;  
  33.   
  34. ProgressDialog progressDialog;  
  35.   
  36. @Override  
  37.   
  38. public void onCreate(Bundle savedInstanceState)  
  39.   
  40. {  
  41.   
  42. super.onCreate(savedInstanceState);  
  43.   
  44. setContentView(R.layout.main);  
  45.   
  46. // setup the button that starts the progress dialog  
  47.   
  48. button = (Button) findViewById(R.id.progressDialog);  
  49.   
  50. button.setOnClickListener(new OnClickListener()  
  51.   
  52. {  
  53.   
  54. @Override  
  55.   
  56. public void onClick(View v)  
  57.   
  58. {  
  59.   
  60. showDialog(PROGRESS_DIALOG);  
  61.   
  62. }  
  63.   
  64. });  
  65.   
  66. }  
  67.   
  68. @Override  
  69.   
  70. protected Dialog onCreateDialog(int id)  
  71.   
  72. {  
  73.   
  74. switch (id)  
  75.   
  76. {  
  77.   
  78. case PROGRESS_DIALOG:  
  79.   
  80. progressDialog = new ProgressDialog(Dialogs.this);  
  81.   
  82. progressDialog  
  83.   
  84. .setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
  85.   
  86. progressDialog.setMessage("Loading...");  
  87.   
  88. progressThread = new ProgressThread(handler);  
  89.   
  90. progressThread.start();  
  91.   
  92. return progressDialog;  
  93.   
  94. default:  
  95.   
  96. return null;  
  97.   
  98. }  
  99.   
  100. }  
  101.   
  102. // Define the Handler that receives messages from the thread and update the  
  103.   
  104. // progress  
  105.   
  106. final Handler handler = new Handler()  
  107.   
  108. {  
  109.   
  110. public void handleMessage(Message msg)  
  111.   
  112. {  
  113.   
  114.   
  115. int total = msg.getData().getInt("total");  
  116.   
  117. progressDialog.setProgress(total);  
  118.   
  119. if (total >= 100)  
  120.   
  121. {  
  122.   
  123. dismissDialog(PROGRESS_DIALOG);  
  124.   
  125. progressThread.setState(ProgressThread.STATE_DONE);  
  126.   
  127. }  
  128.   
  129. }  
  130.   
  131. };  
  132.   
  133. /** 
  134.  
  135. * Nested class that performs progress calculations(counting) 
  136.  
  137. */  
  138.   
  139. private class ProgressThread extends Thread  
  140.   
  141. {  
  142.   
  143. Handler mHandler;  
  144.   
  145. final static int STATE_DONE = 0;  
  146.   
  147. final static int STATE_RUNNING = 1;  
  148.   
  149. int mState;  
  150.   
  151. int total;  
  152.   
  153. ProgressThread(Handler h)  
  154.   
  155. {  
  156.   
  157. mHandler = h;  
  158.   
  159. }  
  160.   
  161. public void run()  
  162.   
  163. {  
  164.   
  165. mState = STATE_RUNNING;  
  166.   
  167. total = 0;  
  168.   
  169. while (mState == STATE_RUNNING)  
  170.   
  171. {  
  172.   
  173. try  
  174.   
  175. {  
  176.   
  177. Thread.sleep(100);  
  178.   
  179. }  
  180.   
  181. catch (InterruptedException e)  
  182.   
  183. {  
  184.   
  185. Log.e("ERROR""Thread Interrupted");  
  186.   
  187. }  
  188.   
  189. Message msg = mHandler.obtainMessage();  
  190.   
  191. Bundle b = new Bundle();  
  192.   
  193. b.putInt("total", total);  
  194.   
  195. msg.setData(b);  
  196.   
  197. mHandler.sendMessage(msg);  
  198.   
  199. total++;  
  200.   
  201. }  
  202.   
  203. }  
  204.   
  205. /** 
  206.  
  207. * sets the current state for the thread, used to stop teh thread 
  208.  
  209. */  
  210.   
  211. public void setState(int state)  
  212.   
  213. {  
  214.   
  215. mState = state;  
  216.   
  217. }  
  218.   
  219. }  
  220.   
  221. }  
  222.   
  223. package org.vhow.android.ui.dialogs;  
  224.   
  225. import android.app.Activity;  
  226.   
  227. import android.app.Dialog;  
  228.   
  229. import android.app.ProgressDialog;  
  230.   
  231. import android.os.Bundle;  
  232.   
  233. import android.os.Handler;  
  234.   
  235. import android.os.Message;  
  236.   
  237. import android.util.Log;  
  238.   
  239. import android.view.View;  
  240.   
  241. import android.view.View.OnClickListener;  
  242.   
  243. import android.widget.Button;  
  244.   
  245.   
  246. public class Dialogs extends Activity  
  247.   
  248. {  
  249.   
  250. static final int PROGRESS_DIALOG = 0;  
  251.   
  252. Button button;  
  253.   
  254. ProgressThread progressThread;  
  255.   
  256. ProgressDialog progressDialog;  
  257.   
  258. @Override  
  259.   
  260. public void onCreate(Bundle savedInstanceState)  
  261.   
  262. {  
  263.   
  264. super.onCreate(savedInstanceState);  
  265.   
  266. setContentView(R.layout.main);  
  267.   
  268. // setup the button that starts the progress dialog  
  269.   
  270. button = (Button) findViewById(R.id.progressDialog);  
  271.   
  272. button.setOnClickListener(new OnClickListener()  
  273.   
  274. {  
  275.   
  276. @Override  
  277.   
  278. public void onClick(View v)  
  279.   
  280. {  
  281.   
  282. showDialog(PROGRESS_DIALOG);  
  283.   
  284. }  
  285.   
  286. });  
  287.   
  288. }  
  289.   
  290. @Override  
  291.   
  292. protected Dialog onCreateDialog(int id)  
  293.   
  294. {  
  295.   
  296. switch (id)  
  297.   
  298. {  
  299.   
  300. case PROGRESS_DIALOG:  
  301.   
  302. progressDialog = new ProgressDialog(Dialogs.this);  
  303.   
  304. progressDialog  
  305.   
  306. .setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
  307.   
  308. progressDialog.setMessage("Loading...");  
  309.   
  310. progressThread = new ProgressThread(handler);  
  311.   
  312. progressThread.start();  
  313.   
  314. return progressDialog;  
  315.   
  316. default:  
  317.   
  318. return null;  
  319.   
  320. }  
  321.   
  322. }  
  323.   
  324. // Define the Handler that receives messages from the thread and update the  
  325.   
  326. // progress  
  327.   
  328. final Handler handler = new Handler()  
  329.   
  330. {  
  331.   
  332. public void handleMessage(Message msg)  
  333.   
  334. {  
  335.   
  336. int total = msg.getData().getInt("total");  
  337.   
  338. progressDialog.setProgress(total);  
  339.   
  340. if (total >= 100)  
  341.   
  342. {  
  343.   
  344. dismissDialog(PROGRESS_DIALOG);  
  345.   
  346. progressThread.setState(ProgressThread.STATE_DONE);  
  347.   
  348. }  
  349.   
  350. }  
  351.   
  352. };  
  353.   
  354. /** 
  355.  
  356. * Nested class that performs progress calculations(counting) 
  357.  
  358. */  
  359.   
  360. private class ProgressThread extends Thread  
  361.   
  362.   
  363. {  
  364.   
  365. Handler mHandler;  
  366.   
  367. final static int STATE_DONE = 0;  
  368.   
  369. final static int STATE_RUNNING = 1;  
  370.   
  371. int mState;  
  372.   
  373. int total;  
  374.   
  375. ProgressThread(Handler h)  
  376.   
  377. {  
  378.   
  379. mHandler = h;  
  380.   
  381. }  
  382.   
  383. public void run()  
  384.   
  385. {  
  386.   
  387. mState = STATE_RUNNING;  
  388.   
  389. total = 0;  
  390.   
  391. while (mState == STATE_RUNNING)  
  392.   
  393. {  
  394.   
  395. try  
  396.   
  397. {  
  398.   
  399. Thread.sleep(100);  
  400.   
  401. }  
  402.   
  403. catch (InterruptedException e)  
  404.   
  405. {  
  406.   
  407. Log.e("ERROR""Thread Interrupted");  
  408.   
  409. }  
  410.   
  411. Message msg = mHandler.obtainMessage();  
  412.   
  413. Bundle b = new Bundle();  
  414.   
  415. b.putInt("total", total);  
  416.   
  417. msg.setData(b);  
  418.   
  419. mHandler.sendMessage(msg);  
  420.   
  421. total++;  
  422.   
  423. }  
  424.   
  425. }  
  426.   
  427. /** 
  428.  
  429. * sets the current state for the thread, used to stop teh thread 
  430.  
  431. */  
  432.   
  433. public void setState(int state)  
  434.   
  435. {  
  436.   
  437. mState = state;  
  438.   
  439. }  
  440.   
  441. }  

0 0
原创粉丝点击