一、AlertDialog的介紹
一個對話框一般是一個出現在當前Activity之上的一個小窗口,處於下面的Activity失去焦點, 對話框接受所有的用戶交互,對話框一般用於提示信息和與當前應用程序直接相關的小功能。
Activities提供了一種方便管理的創建、保存、回覆的對話框機制,例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), dismissDialog(int)等方法,如果使用這些方法的話,Activity將通過getOwnerActivity()方法返回該Activity管理的對話框(dialog).
onCreateDialog(int):當你使用這個回調函數時,Android系統會有效的設置這個Activity爲每個對話框的所有者,從而自動管理每個對話框的狀態並掛靠到Activity上。這樣,每個對話框繼承這個Activity的特定屬性。比如,當一個對話框打開時,菜單鍵顯示爲這個Activity定義的選項菜單,音量鍵修改Activity使用的音頻流。
showDialog(int): 當你想要顯示一個對話框時,調用showDialog(int id) 方法並傳遞一個唯一標識這個對話框的整數。當對話框第一次被請求時,Android從你的Activity中調用onCreateDialog(int id),你應該在這裏初始化這個對話框Dialog。這個回調方法被傳以和showDialog(int id)相同的ID。當你創建這個對話框後,在Activity的最後返回這個對象。
onPrepareDialog(int, Dialog):在對話框被顯示之前,Android還調用了可選的回調函數onPrepareDialog(int id, Dialog). 如果你想在每一次對話框被打開時改變它的任何屬性,你可以定義這個方法。這個方法在每次打開對話框時被調用,而onCreateDialog(int) 僅在對話框第一次打開時被調用。如果你不定義onPrepareDialog(),那麼這個對話框將保持和上次打開時一樣。這個方法也被傳遞以對話框的ID,和在onCreateDialog()中創建的對話框對象。
dismissDialog(int):當你準備關閉對話框時,你可以通過對這個對話框調用dismiss()來消除它。如果需要,你還可以從這個Activity中調用dismissDialog(int id) 方法,這實際上將爲你對這個對話框調用dismiss() 方法。 如果你想使用onCreateDialog(int id) 方法來管理你對話框的狀態(就如同在前面的章節討論的那樣),然後每次你的對話框消除的時候,這個對話框對象的狀態將由該Activity保留。如果你決定不再需要這個對象或者清除該狀態是重要的,那麼你應該調用removeDialog(int id)。這將刪除任何內部對象引用而且如果這個對話框正在顯示,它將被消除。
二、AlertDialog對話框的創建
AlertDialog對話框主要包括:普通對話框、列表對話框、單選對話框和多選對話框。
代碼如下:
package com.danny_jiang.day10_dialog;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
/**
* 普通對話框、列表對話框、單選對話框、多選對話框
* @author Administrator
*
*/
public class MainActivity extends Activity {
private int position = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 所有的AlertDialog統統都是通過Builder去構建的
*/
public void click(View view) {
switch (view.getId()) {
case R.id.alertDialog:
// 初始化Builder對象
AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
// 通過Builder設置對話框的title標題和message內容、以及圖標
builder1.setTitle("殘忍卸載");
builder1.setMessage("真的要卸載嗎 T_T");
builder1.setIcon(R.drawable.ic_launcher);
// 設置爲false說明當前dialog是不能用返回鍵取消的(默認爲true)
builder1.setCancelable(false);
// 設置"堅持卸載"按鈕
builder1.setPositiveButton("堅持卸載", new OnClickListener() {
/**
* 當點擊對話框中某一item時,此方法被調用
*
* @param which 是系統中確認按鈕所對應的位置
*/
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "點擊了卸載按鈕 which is" + which,
Toast.LENGTH_SHORT).show();
}
});
// 設置"取消卸載"按鈕
builder1.setNegativeButton("取消卸載", new OnClickListener() {
//此時的which是取消按鈕的位置,由系統決定
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "點擊了取消按鈕 + which is " + which,
Toast.LENGTH_SHORT).show();
}
});
// 設置"查看詳情"按鈕
builder1.setNeutralButton("查看詳情", new OnClickListener() {
//此時的which是查看詳情的位置,由系統決定
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "點擊了查看詳情+ which is " + which,
Toast.LENGTH_SHORT).show();
}
});
// 通過Builder.show方法顯示對話框
builder1.show();
//AlertDialog dialog = builder1.create();
//dialog.show();
break;
case R.id.listDialog:
Builder builder2 = new Builder(this);
builder2.setTitle("作詩一首");
final String[] arr = getResources().getStringArray(R.array.poet);
//通過setItems設置爲列表對話框樣式
builder2.setItems(arr, new OnClickListener() {
//此參數中的which是顯示列表的item位置信息,從0開始
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "您喜歡 " + arr[which],
Toast.LENGTH_SHORT).show();
}
});
builder2.show();
break;
case R.id.singleDialog:
Builder builder3 = new Builder(this);
builder3.setTitle("作詩一首");
final String[] arr2 = getResources().getStringArray(R.array.arr);
/**
* 通過Builder.setSingleChoiceItems方法設置單選對話框樣式
* 1參數 所需要顯示的列表內容
* 2參數 默認選中item的位置,從0開始。如果設置爲-1,則無選中項
* 3參數 item選中的監聽器
*/
builder3.setSingleChoiceItems(arr2, -1, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
position = which;
}
});
builder3.setNegativeButton("Cancel", null);
builder3.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String content = arr2[position];
Toast.makeText(MainActivity.this, "點擊了 " + content,
Toast.LENGTH_SHORT).show();
}
});
builder3.show();
break;
case R.id.multiDialog:
Builder builder4 = new Builder(this);
builder4.setTitle("選中的興趣愛好");
final String[] arr3 = getResources().getStringArray(R.array.arr2);
//創建boolean數組,長度跟字符串長度一致,保存有哪些item處於選中狀態
final boolean[] checkedPos = new boolean[arr3.length];
final StringBuilder sBuilder = new StringBuilder();
builder4.setMultiChoiceItems(arr3, null, new OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
android.util.Log.e("danny", "which is " + which +
"isChecked is " + isChecked);
checkedPos[which] = isChecked;
}
});
builder4.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
for(int i = 0; i < checkedPos.length; i++) {
if(checkedPos[i]) {
sBuilder.append(arr3[i] + "\n");
}
}
String content = sBuilder.toString();
Toast.makeText(MainActivity.this, content, 1000).show();
}
});
builder4.show();
break;
default:
break;
}
}
}
佈局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="${relativePackage}.${activityClass}" >
<Button
android:id="@+id/alertDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click"
android:text="普通對話框" />
<Button
android:id="@+id/listDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click"
android:text="列表對話框" />
<Button
android:id="@+id/singleDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click"
android:text="單選對話框" />
<Button
android:id="@+id/multiDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click"
android:text="多選對話框" />
</LinearLayout>
strings.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Day10_Dialog</string>
<string name="hello_world">Hello world!</string>
<string-array name="poet">
<item>牀前明月光</item>
<item>我爸是李剛</item>
<item>不識廬山真面目</item>
<item>只識彎弓射大雕</item>
</string-array>
<string-array name="arr">
<item>十年生死兩茫茫</item>
<item>一樹梨花壓海棠</item>
<item>天蒼蒼,野茫茫</item>
<item>一樹梨花壓海棠</item>
</string-array>
<string-array name="arr2">
<item>在天願做比翼鳥</item>
<item>大難臨頭各自飛</item>
<item>老夫療法少年狂</item>
<item>青春作伴好還鄉</item>
</string-array>
</resources>
效果圖如下:
普通對話框
列表對話框
單選對話框
多選對話框
三、自定義View的AlertDialog
有時候系統自帶的AlertDialog風格不能滿足我們的需求,就比如說我們要實現一個Login畫面,有用戶名和密碼,這時我們就要用到自定義View的AlertDialog
1、先創建自定義登錄框的佈局文件my_login_view.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="5dp" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="賬號:" />
<EditText
android:id="@+id/account"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="5dp" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密碼:" />
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="numberPassword" />
</LinearLayout>
</LinearLayout>
2、在Activity的合適地方創建自定義的AlertDialog(比如按鈕的點擊事件中):
package com.vince.login_dialog;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = LayoutInflater.from(this);
final View myLoginView = inflater.inflate(R.layout.login_layout, null);
builder.setView(myLoginView);
builder.setTitle("用戶登錄");
builder.setPositiveButton("確定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
EditText account = (EditText) myLoginView
.findViewById(R.id.account);
EditText password = (EditText) myLoginView
.findViewById(R.id.password);
String acc = account.getText().toString();
String pass = password.getText().toString();
Toast.makeText(MainActivity.this, "賬號:" + acc + " 密碼:" + pass,
Toast.LENGTH_LONG).show();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.show();
}
}
效果圖如下:
四、自定義Adapter的AlertDialog
代碼如下:
package com.vince.dialog_adapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class MainActivity extends Activity {
// 數據源
private List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
private SimpleAdapter adapter;
private AlertDialog dialog;// 對話框
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化適配器
initAdapter();
}
/**
* 初始化適配器
*/
private void initAdapter() {
for (int i = 0; i < 10; i++) {
Map<String,Object> map=new HashMap<String, Object>();
map.put("name", "Android-"+i);
map.put("count", i);
list.add(map);
}
adapter = new SimpleAdapter(this, list,android.R.layout.simple_list_item_2,
new String[]{"name","count"},
new int[]{android.R.id.text1,android.R.id.text2});
}
public void click(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
dialog = builder.setTitle("自定義適配器").setIcon(R.drawable.ic_launcher)
.setAdapter(adapter, new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,
"選中了" + list.get(which).get("name"),
Toast.LENGTH_LONG).show();
}
}).create();
dialog.show();
}
}
效果圖如下:
更多有關AlertDialog的介紹,見http://blog.csdn.net/ameyume/article/details/6138488
http://www.cnblogs.com/jiayongji/p/5371996.html