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,如需轉載請自行聯系原作者