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() { @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>
到這裏自定義對話框的創建就結束了,想要什麼樣子的對話框完全憑你自己的想像。