天天看點

Android開發中Dialog對話框的使用

Dialog是android開發過程中最常用到的元件之一,它包括以下幾種類型:

  警告對話框:Alertialog

  進度對話框:ProgressDialog

  日期選擇對話框:DatePickerDialog

  時間選擇對話框:TimePickerDialog

  自定義對話框:從Dialog繼承

  Dialog的建立方式有兩種:

  一是直接new一個Dialog對象,然後調用Dialog對象的show和dismiss方法來控制對話框的顯示和隐藏。

  二是在Activity的onCreateDialog(int id)方法中建立Dialog對象并傳回,然後調用Activty的showDialog(int id)和dismissDialog(int id)來顯示和隐藏對話框。

  差別在于通過第二種方式建立的對話框會繼承Activity的屬性,比如獲得Activity的menu事件等。

  使用AlertDialog可以建立普通對話框、帶清單的對話框以及帶單選按鈕和多選按鈕的對話框。

  普通對話框

  效果如下:

  

  代碼:

//建立builder

                AlertDialog.Builder builder = new AlertDialog.Builder(DialogSampleActivity.this);

                builder.setTitle("普通對話框")    //标題

                    .setIcon(R.drawable.ic_launcher)    //icon

                    .setCancelable(false)    //不響應back按鈕

                    .setMessage("這是一個普通對話框")    //對話框顯示内容

                  //設定按鈕

                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {

                        @Override

                        public void onClick(DialogInterface dialog, int which) {

                            Toast.makeText(DialogSampleActivity.this, "點選了确定按鈕", Toast.LENGTH_SHORT).show();

                        }

                    })

                    .setNeutralButton("中立", new DialogInterface.OnClickListener() {                        

                            Toast.makeText(DialogSampleActivity.this, "點選了中立按鈕", Toast.LENGTH_SHORT).show();

                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {                    

                            Toast.makeText(DialogSampleActivity.this, "點選了取消按鈕", Toast.LENGTH_SHORT).show();

                    });

                //建立Dialog對象

                AlertDialog dlg = builder.create();

                return dlg;

  帶清單的對話框

  效果圖:

 final CharSequence[] items = { "Item1", "Item2", "Item3" };

            // 建立builder

            AlertDialog.Builder builder = new AlertDialog.Builder(

                    DialogSampleActivity.this);

            builder.setTitle("清單對話框") // 标題

                    .setIcon(R.drawable.ic_launcher) // icon

                    .setCancelable(false) // 不響應back按鈕

                    .setItems(items, new DialogInterface.OnClickListener() {

                            Toast.makeText(DialogSampleActivity.this,

                                    "選擇了" + items[which], Toast.LENGTH_SHORT)

                                    .show();

            // 建立Dialog對象

            AlertDialog dlg = builder.create();

            return dlg;

  帶單選按鈕的清單對話框

  隻需将setItems替換為:

.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {

  這裡多了一個參數-1,代表預設選中第幾項,-1表示預設不選中

  帶複選框的清單對話框

.setMultiChoiceItems(items, checked, new DialogInterface.OnMultiChoiceClickListener() {        

                        public void onClick(DialogInterface dialog, int which, boolean isChecked) {

  參數checked偉boolean數組,表示預設哪些複選框是被選中的。

  另外,如果你想要擷取list中哪些項是被選中的,你需要:

//獲得ListView

ListView list = dlg.getListView();

//判斷第i項是否被選中,為真表示被選中,為假表示沒有選中

list.getCheckedItemPositions().get(i)

  日期選擇對話框

Calendar calendar = Calendar.getInstance();

            DatePickerDialog.OnDateSetListener dateListener =   

                new DatePickerDialog.OnDateSetListener() {  

                    @Override  

                    public void onDateSet(DatePicker datePicker,   

                            int year, int month, int dayOfMonth) {  

                        Toast.makeText(DialogSampleActivity.this,

                                year + "年" + (month+1) + "月" + dayOfMonth + "日", Toast.LENGTH_SHORT)

                                .show();  

                    }

                };  

            DatePickerDialog dlg = new DatePickerDialog(

                    DialogSampleActivity.this,

                    dateListener,

                    calendar.get(Calendar.YEAR),

                    calendar.get(Calendar.MONTH),

                    calendar.get(Calendar.DAY_OF_MONTH));

  時間選擇對話框

 Calendar calendar = Calendar.getInstance();

            TimePickerDialog.OnTimeSetListener timeListener =   

                new TimePickerDialog.OnTimeSetListener() {

                    @Override

                    public void onTimeSet(TimePicker timePicker, int hourOfDay, int minute) {

                                hourOfDay + ":" + minute, Toast.LENGTH_SHORT).show();  

                    }  

            TimePickerDialog dlg = new TimePickerDialog(

                    timeListener,

                    calendar.get(Calendar.HOUR_OF_DAY),

                    calendar.get(Calendar.MINUTE),

                    true);

  自定義對話框

  步驟:

  1、建立對話框的布局檔案

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content">

      <!-- 标題欄 -->

      <LinearLayout

          android:id="@+id/dlg_priority_titlebar"

          android:orientation="horizontal"

          android:layout_width="fill_parent"

          android:layout_height="wrap_content"

          android:layout_alignParentTop="true">

          <ImageView

            android:src="@drawable/star_gray"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_margin="5dip"/>

        <TextView

            android:text="選擇任務優先級"

            android:layout_gravity="center_vertical"/>

      </LinearLayout>

      <!-- 任務優先級 -->

      <ListView

          android:id="@+id/dlg_priority_lvw"

          android:layout_width="wrap_content"

          android:layout_below="@id/dlg_priority_titlebar"

          android:background="@drawable/layout_home_bg">

      </ListView>     

</RelativeLayout>

  2、因為該布局中使用了自定義的ListView,是以再為ListView建立布局檔案

<?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"    >    <ImageView          android:id="@+id/list_priority_img"          android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:layout_gravity="center_vertical"          android:layout_margin="5dip"                  />    <TextView         android:id="@+id/list_priority_value"         android:layout_width="wrap_content"         android:layout_height="wrap_content"        android:layout_gravity="center_vertical"         android:textSize="28dip"         android:textColor="@drawable/black"/></LinearLayout>

  3、建立自定義Dialog類PriorityDlg繼承自Dialog

public class PriorityDlg extends Dialog {

    private Context context;

    private ListView dlg_priority_lvw = null;

    public PriorityDlg(Context context) {

        super(context);

        this.context = context;

        // TODO Auto-generated constructor stub

    }

    public PriorityDlg(Context context, int theme) {

        super(context, theme);

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        // TODO Auto-generated method stub

        super.onCreate(savedInstanceState);

      //設定對話框使用的布局檔案

        this.setContentView(R.layout.dlg_priority);

        dlg_priority_lvw = (ListView) findViewById(R.id.dlg_priority_lvw);

        // 設定ListView的資料源

        SimpleAdapter adapter = new SimpleAdapter(context, getPriorityList(),

                R.layout.lvw_priority, new String[] { "list_priority_img",

                        "list_priority_value" }, new int[] {

                        R.id.list_priority_img, R.id.list_priority_value });

        dlg_priority_lvw.setAdapter(adapter);

        // 為ListView設定監聽器

        dlg_priority_lvw

                .setOnItemClickListener(new AdapterView.OnItemClickListener() {

                    public void onItemClick(AdapterView<?> arg0, View arg1,

                            int arg2, long arg3) {

                });

    /**

     * 得到ListView資料源

     * 

     * @return

     */

    private List<HashMap<String, Object>> getPriorityList() {

        List<HashMap<String, Object>> priorityList = new ArrayList<HashMap<String, Object>>();

        HashMap<String, Object> map1 = new HashMap<String, Object>();

        map1.put("list_priority_img", R.drawable.priority_not_important);

        map1.put("list_priority_value", context.getResources().getString(

                R.string.dlg_priority_not_important));

        priorityList.add(map1);

        HashMap<String, Object> map2 = new HashMap<String, Object>();

        map2.put("list_priority_img", R.drawable.priority_general);

        map2.put("list_priority_value", context.getResources().getString(

                R.string.dlg_priority_general));

        priorityList.add(map2);

        HashMap<String, Object> map3 = new HashMap<String, Object>();

        map3.put("list_priority_img", R.drawable.priority_important);

        map3.put("list_priority_value", context.getResources().getString(

                R.string.dlg_priority_important));

        priorityList.add(map3);

        HashMap<String, Object> map4 = new HashMap<String, Object>();

        map4.put("list_priority_img", R.drawable.priority_very_important);

        map4.put("list_priority_value", context.getResources().getString(

                R.string.dlg_priority_very_important));

        priorityList.add(map4);

        return priorityList;

}

  4、建立自定義對話框

PriorityDlg dlg = new PriorityDlg(SimpleTaskActivity.this, R.style.dlg_priority);

return dlg;

  這裡的R.style.dlg_priority設定了對話框使用的樣式檔案,隻是讓對話框去掉标題欄,當然你也可以通過代碼來完成這種效果:

<?xml version="1.0" encoding="utf-8"?><resources>    <!-- 對話框樣式 -->    <style name="dlg_priority"parent="@android:Theme.Dialog">        <item name="android:windowNoTitle">true</item>    </style></resources>

  到這裡自定義對話框的建立就結束了,想要什麼樣子的對話框完全憑你自己的想像。

本文轉自 wws5201985 51CTO部落格,原文連結:http://blog.51cto.com/wws5201985/736044,如需轉載請自行聯系原作者

繼續閱讀