Android中Dialog的使用

 

 

 

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

  1. 警告對話框:Alertialog
  2. 進度對話框:ProgressDialog
  3. 日期選擇對話框:DatePickerDialog
  4. 時間選擇對話框:TimePickerDialog
  5. 自定義對話框:從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() {                        
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(DialogSampleActivity.this, "點擊了中立按鈕", Toast.LENGTH_SHORT).show();
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {                    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            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() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(DialogSampleActivity.this,
                                    "選擇了" + items[which], Toast.LENGTH_SHORT)
                                    .show();
                        }
                    });
            // 創建Dialog對象
            AlertDialog dlg = builder.create();
            return dlg;
複製代碼

帶單選按鈕的列表對話框
只需將setItems替換爲:

複製代碼
.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(DialogSampleActivity.this,
                                    "選擇了" + items[which], Toast.LENGTH_SHORT)
                                    .show();
                        }
                    });
複製代碼

這裏多了一個參數-1,代表默認選中第幾項,-1表示默認不選中
帶複選框的列表對話框

只需將setItems替換爲:

複製代碼
.setMultiChoiceItems(items, checked, new DialogInterface.OnMultiChoiceClickListener() {        
                        @Override
                        public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                            Toast.makeText(DialogSampleActivity.this,
                                    "選擇了" + items[which], Toast.LENGTH_SHORT)
                                    .show();
                        }
                    });
複製代碼

參數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));
            return dlg;
複製代碼

時間選擇對話框
效果圖:

代碼:

複製代碼
       Calendar calendar = Calendar.getInstance();
            TimePickerDialog.OnTimeSetListener timeListener =   
                new TimePickerDialog.OnTimeSetListener() {

                    @Override
                    public void onTimeSet(TimePicker timePicker, int hourOfDay, int minute) {
                        Toast.makeText(DialogSampleActivity.this,
                                hourOfDay + ":" + minute, Toast.LENGTH_SHORT).show();  
                    }  
                   
                };  
            TimePickerDialog dlg = new TimePickerDialog(
                    DialogSampleActivity.this,
                    timeListener,
                    calendar.get(Calendar.HOUR_OF_DAY),
                    calendar.get(Calendar.MINUTE),
                    true);
            return dlg;
複製代碼

自定義對話框
效果圖:

步驟:

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:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="選擇任務優先級"
            android:layout_gravity="center_vertical"/>
      </LinearLayout>
      <!-- 任務優先級 -->
      <ListView
          android:id="@+id/dlg_priority_lvw"
          android:layout_width="wrap_content"
          android:layout_height="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);
        this.context = context;
    }
    
    @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() {

                    @Override
                    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>
複製代碼

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章