轉自:http://www.cnblogs.com/salam/archive/2010/11/15/1877512.html
相似的:http://blog.csdn.net/xys289187120/article/details/6601613
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)。這将删除任何内部對象引用而且如果這個對話框正在顯示,它将被消除。
下面是幾種對話框的效果:
圖1 圖2 圖3
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICNzcjMzMTMwIDNwgDMzEDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
圖4 圖5 圖6
圖7
圖一效果具體代碼
main.xml布局配置
<Button
android:id="@+id/idButtonDialog1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Dialog1"
android:onClick="clickButtonDialog1"
/>
Activity代碼
/**
* 重載目前Activity的[鍵盤按下]事件處理方法.
*/
public boolean onKeyDown(int keyCode, KeyEvent event) {
//KeyEvent.KEYCODE_BACK:鍵盤上的[back]按鍵
//捕獲按鍵:按下[back]鍵并且沒有重複
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
showDialog1();
}
return false;
}
public void clickButtonDialog1(View v){
showDialog1();
}
public void showDialog1(){
AlertDialog.Builder builder = new Builder(this)
.setMessage("确認退出嗎?")//設定對話框内容
.setTitle("提示")//設定對話框标題
.setPositiveButton("确定", new OnClickListener() {//設定對話框[肯定]按鈕
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();//關閉對話框
finish();//結束目前Activity
}
})
.setNegativeButton("取消", new OnClickListener() {//設定對話框[否定]按鈕
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();//關閉對話框
}
});
builder.create().show();//建立對話框并且顯示該對話框
}
圖二效果具體代碼
main.xml布局配置
<Button
android:id="@+id/idButtonDialog2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Dialog2"
android:onClick="clickButtonDialog2"
/>
Activity代碼
public void clickButtonDialog2(View v){
showDialog2();
}
public void showDialog2(){
final Context context = this;
Dialog dialog = new AlertDialog.Builder(context)
.setIcon(android.R.drawable.btn_star)//設定對話框圖示
.setTitle("喜好調查")//設定對話框标題
.setMessage("你喜歡李連傑的電影嗎?")//設定對話框内容
.setPositiveButton("很喜歡", new OnClickListener(){//設定對話框[肯定]按鈕
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "我很喜歡他的電影。", Toast.LENGTH_LONG).show();
}
})
.setNegativeButton("不喜歡", new OnClickListener(){//設定對話框[否定]按鈕
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "我不喜歡他的電影。", Toast.LENGTH_LONG).show();
}
})
.setNeutralButton("一般", new OnClickListener(){//設定對話框[中性]按鈕
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "談不上喜歡不喜歡。", Toast.LENGTH_LONG).show();
}
}).create();//建立對話框
dialog.show();//顯示對話框
}
圖三效果具體代碼
main.xml布局配置
<Button
android:id="@+id/idButtonDialog3"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Dialog3"
android:onClick="clickButtonDialog3"
/>
Activity代碼
public void clickButtonDialog3(View v){
showDialog3();
}
public void showDialog3(){
final Context context = this;
//定義1個文本輸入框
final EditText userName = new EditText(this);
//建立對話框
new AlertDialog.Builder(context)
.setTitle("請輸入")//設定對話框标題
.setIcon(android.R.drawable.ic_dialog_info)//設定對話框圖示
.setView(userName)//為對話框添加要顯示的元件
.setPositiveButton("确定", new OnClickListener(){//設定對話框[肯定]按鈕
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "userName="+userName.getText().toString(), Toast.LENGTH_LONG).show();
}
})
.setNegativeButton("取消", null)//設定對話框[否定]按鈕
.show();
}
圖四效果具體代碼
main.xml布局配置
<Button
android:id="@+id/idButtonDialog4"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Dialog4"
android:onClick="clickButtonDialog4"
/>
Activity代碼
public void clickButtonDialog4(View v){
showDialog4();
}
public void showDialog4(){
final Context context = this;
//定義單選框選項
String[] singleChoiceItems = {"Item1","Item2"};
int defaultSelectedIndex = 1;//單選框預設值:從0開始
//建立對話框
new AlertDialog.Builder(context)
.setTitle("單選框")//設定對話框标題
.setIcon(android.R.drawable.ic_dialog_info)//設定對話框圖示
.setSingleChoiceItems(singleChoiceItems, defaultSelectedIndex, new OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "Item is "+which, Toast.LENGTH_LONG).show();
}
})
.setPositiveButton("确定", null)//設定對話框[肯定]按鈕
.setNegativeButton("取消", null)//設定對話框[否定]按鈕
.show();
}
圖五效果具體代碼
main.xml布局配置
<Button
android:id="@+id/idButtonDialog5"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Dialog5"
android:onClick="clickButtonDialog5"
/>
Activity代碼
public void clickButtonDialog5(View v){
showDialog5();
}
public void showDialog5(){
final Context context = this;
//定義複選框選項
String[] multiChoiceItems = {"Item1","Item2"};
boolean[] defaultSelectedStatus = {false,true};//複選框預設值:false=未選;true=選中
//建立對話框
new AlertDialog.Builder(context)
.setTitle("複選框")//設定對話框标題
.setMultiChoiceItems(multiChoiceItems, defaultSelectedStatus, new OnMultiChoiceClickListener(){
@Override
public void onClick(DialogInterface dialog, int which,
boolean isChecked) {
Toast.makeText(context, "Item"+which+"'s status is "+isChecked+".", Toast.LENGTH_LONG).show();
}
})
.setPositiveButton("确定", null)//設定對話框[肯定]按鈕
.setNegativeButton("取消", null)//設定對話框[否定]按鈕
.show();
}
圖六效果具體代碼
main.xml布局配置
<Button
android:id="@+id/idButtonDialog6"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Dialog6"
android:onClick="clickButtonDialog6"
/>
Activity代碼
public void clickButtonDialog6(View v){
showDialog6();
}
public void showDialog6(){
final Context context = this;
//定義清單選項
String[] items = {"Item1","Item2"};
//建立對話框
new AlertDialog.Builder(context)
.setTitle("清單")//設定對話框标題
.setItems(items, new OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "Item is "+which+".", Toast.LENGTH_LONG).show();
}
})
.setNegativeButton("取消", new OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(context, "Button is "+which+" click.", Toast.LENGTH_LONG).show();
}
})//設定對話框[否定]按鈕
.show();
}
圖七效果具體代碼
main.xml布局配置
<Button
android:id="@+id/idButtonDialog7"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Dialog7"
android:onClick="clickButtonDialog7"
/>
另外需要布局配置檔案 main_dialog_custom.xml ,内容:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/customDialog"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名:"
/>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:minWidth="200dip"
android:id="@+id/dialogCustomEditTextUserName"
/>
</LinearLayout>
Activity代碼
public void clickButtonDialog7(View v){
showDialog7();
}
public void showDialog7(){
final Context context = this;
//初始化自定義布局參數
LayoutInflater layoutInflater = getLayoutInflater();
//為了能在下面的OnClickListener中擷取布局上元件的資料,必須定義為final類型.
final View customLayout = layoutInflater.inflate(R.layout.main_dialog_custom, (ViewGroup)findViewById(R.id.customDialog));
//建立對話框
new AlertDialog.Builder(context)
.setTitle("自定義布局")//設定對話框标題
.setView(customLayout)//為對話框添加元件
.setPositiveButton("确定", new OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
//擷取自定義布局上的輸入框的值
EditText customDialogUserName = (EditText)customLayout.findViewById(R.id.dialogCustomEditTextUserName);
Toast.makeText(context, "姓名="+customDialogUserName.getText().toString(), Toast.LENGTH_SHORT).show();
}
})//設定對話框[肯定]按鈕
.setNegativeButton("取消", null)//設定對話框[否定]按鈕
.show();
}
圖八效果具體代碼
說明:圖八和圖七理論上一樣的,都是自定義布局對話框。不過,圖八方式可以用來替換手機的系統選項菜單風格。
main.xml配置
<Button
android:id="@+id/idButtonDialog8"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Dialog8"
android:onClick="clickButtonDialog8"
/>
menu_gridview.xml配置
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<GridView
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:numColumns="4"
android:verticalSpacing="10dip"
android:horizontalSpacing="10dip"
android:stretchMode="columnWidth"
android:gravity="center"
/>
</LinearLayout>
menu_item.xml配置
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout_Item"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:paddingBottom="5dip"
>
<ImageView
android:id="@+id/item_image"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:layout_below="@id/item_image"
android:id="@+id/item_text"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
Activity代碼
//定義選項菜單
private String[] allOptionsMenuTexts = {"删除","儲存","幫助","添加","詳細","發送","電話","照相"};
private int[] allOptionsMenuOrders = {5,2,6,1,4,3,7,8};
private int[] allOptionsMenuIds = {Menu.FIRST+1,Menu.FIRST+2,Menu.FIRST+3,Menu.FIRST+4,Menu.FIRST+5,Menu.FIRST+6,Menu.FIRST+7,Menu.FIRST+8};
private int[] allOptionsMenuIcons = {
android.R.drawable.ic_menu_delete,
android.R.drawable.ic_menu_edit,
android.R.drawable.ic_menu_help,
android.R.drawable.ic_menu_add,
android.R.drawable.ic_menu_info_details,
android.R.drawable.ic_menu_send,
android.R.drawable.ic_menu_call,
android.R.drawable.ic_menu_camera
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_dialog);
}
public void clickButtonDialog8(View v){
showDialog8();
}
public void showDialog8(){
final Context context = this;
//擷取自定義布局
LayoutInflater layoutInflater = getLayoutInflater();
View menuView = layoutInflater.inflate(R.layout.menu_gridview, null);
//擷取GridView元件并配置擴充卡
GridView gridView = (GridView)menuView.findViewById(R.id.gridview);
SimpleAdapter menuSimpleAdapter = createSimpleAdapter(allOptionsMenuTexts,allOptionsMenuIcons);
gridView.setAdapter(menuSimpleAdapter);
gridView.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(context, "菜單["+allOptionsMenuTexts[position]+"]點選了.", Toast.LENGTH_SHORT).show();
}
});
//建立對話框并顯示
new AlertDialog.Builder(context).setView(menuView).show();
}
public SimpleAdapter createSimpleAdapter(String[] menuNames,int[] menuImages){
List<Map<String,?>> data = new ArrayList<Map<String,?>>();
String[] fromsAdapter = {"item_text","item_image"};
int[] tosAdapter = {R.id.item_text,R.id.item_image};
for(int i=0;i<menuNames.length;i++){
Map<String,Object> map = new HashMap<String,Object>();
map.put(fromsAdapter[0], menuNames[i]);
map.put(fromsAdapter[1], menuImages[i]);
data.add(map);
}
SimpleAdapter SimpleAdapter = new SimpleAdapter(this, data, R.layout.menu_item, fromsAdapter, tosAdapter);
return SimpleAdapter;
}