android開發-使用Dialog AlertDialog

來源:互聯網
上載者:User

 

Dialog對話方塊,大家肯定都不陌生。我們使用Windows作業系統、IE瀏覽器等經常會彈出對話方塊,這些對話方塊大部分都是模態的同步對話方塊。所謂的模態是指:當前彈出的Dialog擋住了它的父視窗,在Dialog消失前,父視窗無法擷取焦點,瀏覽器中的alert對話方塊就是這樣的;所謂的同步是指:程式執行到彈出Dialog後就停在當前行代碼,等到Dialog處理完後程式才接著往下執行。

在Android中Dialog是模態非同步,所謂非同步Dialog就像是:你在跟一個人交談,但是你的大腦在想其他東西。android彈出Dialog與使用者互動時後台執行線程還是接著執行。同時android中dialog還是managed的,所謂managed是指系統幫你維護dialog,它們可以建立一次後被多次調用,這樣就可以不必每次需要dialog都重新建立一個,節省了記憶體且提供系統的效能。

Dialog通常是擋在activity前的一個小表單,activity失去焦點,由dialog與使用者進行互動,然後根據使用者的選擇或者輸入程式再決定如何運行分支。在Android中有下面幾種Dialog:

AlertDialog:一個可以擁有0、1、2或3個按鈕的對話方塊,它裡面的內容可以是文本、checkbox或radio的ListView,它是一個經常被用到的Dialog。

ProgressDialog:一個表單內部是Progress bar的Dialog,它繼承了AlertDialog,所以它擁有的按鈕跟AlertDialog一樣。

DatePickerDialog:一個提供選擇日期功能的Dialog。

TimePickerDialog:一個提供選擇時間功能的Dialog。

也可以建立自訂的Dialog,自己定義它的布局。下面我們來看看各種dialog的使用方法。首先先從最簡單的Alert Dialog瞭解。

AlertDialog主要用來提示一些文本資訊,它跟Javascript中的alert方法不一樣。Javascript中alert是模態同步表單,而android中的AlertDialog則是模態非同步表單。我們使用AlertDialog.Builder來建立AlertDialog對象,你可以使用這個Builder來完成下面幾種任務:

1. 顯示提示資訊,讓使用者選擇是或否。

2. 從Dialog中提供的ListView裡選擇一個Item

3.從Dialog中提供的ListView裡選擇多個Item

4. 顯示一個進度條

5. 從幾個選項中選擇一個

建立AlertDialog的步驟分為幾步:

1. 建立一個Builder對象

2. 設定要建立的Dialog的參數,如幾個按鈕,顯示什麼內容等。

3. 對按鈕設定回呼函數(因為android中的dialog都是非同步,所以要回呼函數)

4. 根據上面幾步的設定,讓Builder產生dialog對象

5. 使用show()方法將dialog顯示出來。

建立一個Activity和一個布局xml檔案:

dialog.xml:

<?xml version="1.0" encoding="utf-8"?><br /><LinearLayout<br /> xmlns:android="http://schemas.android.com/apk/res/android"<br /> android:orientation="vertical"<br /> android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"></p><p> <Button<br /> android:layout_width="wrap_content"<br /> android:layout_height="wrap_content"<br /> android:text="顯示dialog"<br /> android:onClick="onShowDialogClick"<br /> /></p><p></LinearLayout> 

DialogActivity.java

package com.king.dialog</p><p>import android.app.Activity;<br />import android.app.AlertDialog;<br />import android.content.DialogInterface;<br />import android.os.Bundle;<br />import android.view.View;</p><p>import com.android777.demo.uicontroller.R;</p><p>public class DemoDialog extends Activity {</p><p> @Override<br /> protected void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);</p><p> setContentView(R.layout.dialog);</p><p> }</p><p> public void onShowDialogClick(View v){</p><p> AlertDialog.Builder builder = new AlertDialog.Builder(this);<br /> builder.setTitle("測試AlertDialog");<br /> builder.setPositiveButton("OK", new EmptyListener());<br /> AlertDialog ad = builder.create();</p><p> ad.show();</p><p> }<br /> //空的監聽類<br /> private class EmptyListener implements DialogInterface.OnClickListener{</p><p> @Override<br /> public void onClick(DialogInterface dialog, int which) {</p><p> }</p><p> }</p><p>} 

上面是一個很簡單的Dialog,接下來我們看看稍微複雜點的Dialog看看它能提供哪些功能?

public void onShowDialogClick(View v){</p><p> AlertDialog.Builder builder = new AlertDialog.Builder(this);<br /> EmptyListener l = new EmptyListener();</p><p> //設定Dialog的標題<br /> builder.setTitle("測試AlertDialog");<br /> //設定Dialog的icon<br /> builder.setIcon(R.drawable.icon);<br /> //設定Dialog的提示資訊<br /> builder.setMessage("這個是一個提示資訊,請選擇是或否");<br /> builder.setPositiveButton("是", l);<br /> builder.setNegativeButton("否", l);<br /> AlertDialog ad = builder.create();</p><p> ad.show();</p><p>}<br /> 

 

也可以在Dialog中存放單選或者多選的ListView,首先先定義要顯示的items,我們把它放在資源檔res/values/arrays.xml裡:

res/values/arrays.xml:

<?xml version="1.0" encoding="utf-8"?><br /><resources></p><p> <string-array name="select_days"><br /> <item>星期一</item><br /> <item>星期二</item><br /> <item>星期三</item><br /> <item>星期四</item><br /> <item>星期五</item><br /> <item>星期六</item><br /> <item>星期天</item><br /> </string-array></p><p></resources><br /> 

public void onShowDialogClick(View v){</p><p> AlertDialog.Builder builder = new AlertDialog.Builder(this);<br /> EmptyListener l = new EmptyListener();</p><p> //設定Dialog的標題<br /> builder.setTitle("測試AlertDialog");<br /> //設定可供選擇的ListView<br /> builder.setItems(R.array.select_days, new DialogInterface.OnClickListener() {</p><p> @Override<br /> public void onClick(DialogInterface dialog, int which) {<br /> //which是選中的位置(基於0的)<br /> String[] items = getResources().getStringArray(R.array.select_days);<br /> Toast.makeText(DemoDialog.this, items[which], Toast.LENGTH_LONG).show();<br /> }<br /> });</p><p> AlertDialog ad = builder.create();</p><p> ad.show();</p><p>} 

設定單選只需要將setItems方法改為:setSingleChoiceItems,同時多一個參數checkItem表示預設選中第幾個選項即可。不過這邊跟setItems不一樣的是,setItems時當使用者選中某個Item時會觸發回呼函數同時關閉視窗,而setSingleChoiceItems當使用者選中某個Item時會觸發回呼函數,但是不會關閉視窗,使用者需要通過設定3個按鈕中任意一個來關閉視窗。

public void onShowDialogClick(View v){</p><p> AlertDialog.Builder builder = new AlertDialog.Builder(this);<br /> EmptyListener l = new EmptyListener();</p><p> //設定Dialog的標題<br /> builder.setTitle("測試AlertDialog");<br /> //設定可供選擇的ListView<br /> builder.setSingleChoiceItems(R.array.select_days,0, new DialogInterface.OnClickListener() {</p><p> @Override<br /> public void onClick(DialogInterface dialog, int which) {<br /> //which是選中的位置(基於0的)<br /> String[] items = getResources().getStringArray(R.array.select_days);<br /> Toast.makeText(DemoDialog.this, items[which], Toast.LENGTH_LONG).show();<br /> }<br /> });</p><p> builder.setPositiveButton("確定", l);</p><p> AlertDialog ad = builder.create();</p><p> ad.show();</p><p>} 

 

可以看到當點擊ListView中的Items時,回調方法有執行,但是表單沒有自動關閉。

設定多選框跟單選框差不多,它調用方法:setMultiChoiceItems。但是參數有個地方不一樣,因為單選的情況下只有一個Item被選中所以可以用一個以0開始的數字來表示選中第幾個,但是多選有可能選中多個所以用一個boolean數組來存放各個Item的狀態,選中為true,否則為false。

 

日期選擇對話方塊:

Calendar c = Calendar.getInstance();<br /> DatePickerDialog ad = new DatePickerDialog(this,<br /> new OnDateSetListener() {<br /> public void onDateSet(DatePicker view, int year,<br /> int monthOfYear, int dayOfMonth) {<br /> // TODO Auto-generated method stub<br /> String date = String.valueOf(year) + "-"<br /> + String.valueOf(monthOfYear + 1) + "-"<br /> + String.valueOf(dayOfMonth);<br /> }<br /> }, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c<br /> .get(Calendar.DATE));<br /> ad.show(); 

時間選擇對話方塊:

TimePickerDialog ad = new TimePickerDialog(this,<br /> new OnTimeSetListener() {<br /> public void onTimeSet(TimePicker view, int hourOfDay,<br /> int minute) {<br /> // TODO Auto-generated method stub<br /> String timer =“”;<br /> if (hourOfDay < 10) {<br /> timer = "0" + String.valueOf(hourOfDay) + ":"<br /> + String.valueOf(minute);<br /> } else if (minute < 10) {<br /> timer = String.valueOf(hourOfDay) + ":" + "0"<br /> + String.valueOf(minute);<br /> } else if (hourOfDay < 10 && minute < 10) {<br /> timer = "0" + String.valueOf(hourOfDay) + ":" + "0"<br /> + String.valueOf(minute);<br /> } else {<br /> timer = String.valueOf(hourOfDay) + ":"<br /> + String.valueOf(minute);<br /> }<br /> }, c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), true);<br /> ad.show(); 

待輸入框的對話方塊:

EditText edt = new EditText(ActivityNoteBooks.this);<br /> //彈出對話方塊的時候裡面帶有文字<br /> edt.setText(text);<br /> AlertDialog ad = new AlertDialog.Builder(this).setTitle(<br /> R.string.wishnametitle).setView(edt).setPositiveButton(<br /> R.string.ok, new OnClickListener() {<br /> public void onClick(DialogInterface dialog, int which) {<br /> // TODO Auto-generated method stub<br /> String s = edt.getText().toString();<br /> }<br /> }).setNegativeButton(R.string.cancle, null).create();<br /> ad.show();<br /> } 


 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.