天天看點

Android 對話框(Dialog)大全 建立你自己的對話框

轉自: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                 

Android 對話框(Dialog)大全 建立你自己的對話框
Android 對話框(Dialog)大全 建立你自己的對話框
Android 對話框(Dialog)大全 建立你自己的對話框

                            圖4                                 圖5                                     圖6

Android 對話框(Dialog)大全 建立你自己的對話框
Android 對話框(Dialog)大全 建立你自己的對話框
Android 對話框(Dialog)大全 建立你自己的對話框

                        圖7

Android 對話框(Dialog)大全 建立你自己的對話框

圖一效果具體代碼

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;  
}