Android对话框Dialog深度剖析.docx
- 文档编号:29155645
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:19
- 大小:22.71KB
Android对话框Dialog深度剖析.docx
《Android对话框Dialog深度剖析.docx》由会员分享,可在线阅读,更多相关《Android对话框Dialog深度剖析.docx(19页珍藏版)》请在冰豆网上搜索。
Android对话框Dialog深度剖析
Android对话框Dialog深度剖析
Dialog类是对话框的基类,但您应该避免直接实例化Dialog,而是使用下列子类之一:
AlertDialog
此对话框可显示标题、最多三个按钮、可选择项列表或自定义布局。
DatePickerDialog或TimePickerDialog
此对话框带有允许用户选择日期或时间的预定义UI。
避免使用ProgressDialog
Android包括另一种名为ProgressDialog的对话框类,可显示具有进度条的对话框。
不过,如需指示加载进度或不确定的进度,则应改为遵循进度和Activity的设计指南,并在您的布局中使用ProgressBar。
这些类定义您的对话框的样式和结构,但您应该将DialogFragment用作对话框的容器。
DialogFragment类提供您创建对话框和管理其外观所需的所有控件,而不是调用Dialog对象上的方法。
使用DialogFragment管理对话框可确保它能正确处理生命周期事件,如用户按“返回”按钮或旋转屏幕时。
此外,DialogFragment类还允许您将对话框的UI作为嵌入式组件在较大UI中重复使用,就像传统Fragment一样(例如,当您想让对话框UI在大屏幕和小屏幕上具有不同外观时)。
注:
由于DialogFragment类最初是通过Android3.0(API级别11)添加的,因此本文描述的是如何使用支持库附带的DialogFragment类。
通过将该库添加到您的应用,您可以在运行Android1.6或更高版本的设备上使用DialogFragment以及各种其他API。
如果您的应用支持的最低版本是API级别11或更高版本,则可使用DialogFragment的框架版本,但请注意,本文中的链接适用于支持库API。
使用支持库时,请确保您导入的是类,而不是
创建对话框片段
您可以完成各种对话框设计—包括自定义布局以及对话框设计指南中描述的布局—通过扩展DialogFragment并在onCreateDialog()回调方法中创建AlertDialog。
例如,以下是一个在DialogFragment内管理的基础AlertDialog:
publicclassFireMissilesDialogFragmentextendsDialogFragment{
@Override
publicDialogonCreateDialog(BundlesavedInstanceState){
//UsetheBuilderclassforconvenientdialogconstruction
AlertDialog.Builderbuilder=newAlertDialog.Builder(getActivity());
builder.setMessage(
.setPositiveButton(,newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intid){
//FIREZEMISSILES!
}
})
.setNegativeButton(,newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intid){
//Usercancelledthedialog
}
});
//CreatetheAlertDialogobjectandreturnit
returnbuilder.create();
}
}
图1.一个包含消息和两个操作按钮的对话框。
现在,当您创建此类的实例并调用该对象上的show()时,对话框将如图1所示。
下文将详细描述如何使用AlertDialog.BuilderAPI创建对话框。
根据对话框的复杂程度,您可以在DialogFragment中实现各种其他回调方法,包括所有基础片段生命周期方法。
构建提醒对话框
您可以通过AlertDialog类构建各种对话框设计,并且该类通常是您需要的唯一对话框类。
如图2所示,提醒对话框有三个区域:
图2.对话框的布局。
标题
这是可选项,只应在内容区域被详细消息、列表或自定义布局占据时使用。
如需陈述的是一条简单消息或问题(如图1中的对话框),则不需要标题。
内容区域
它可以显示消息、列表或其他自定义布局。
操作按钮
对话框中的操作按钮不应超过三个。
AlertDialog.Builder类提供的API允许您创建具有这几种内容(包括自定义布局)的AlertDialog。
要想构建AlertDialog,请执行以下操作:
//1.InstantiateanAlertDialog.Builderwithitsconstructor
AlertDialog.Builderbuilder=newAlertDialog.Builder(getActivity());
//2.Chaintogethervarioussettermethodstosetthedialogcharacteristics
builder.setMessage(
.setTitle(;
//3.GettheAlertDialogfromcreate()
AlertDialogdialog=builder.create();
以下主题介绍如何使用AlertDialog.Builder类定义各种对话框属性。
添加按钮
要想添加如图2所示的操作按钮,请调用setPositiveButton()和setNegativeButton()方法:
AlertDialog.Builderbuilder=newAlertDialog.Builder(getActivity());
//Addthebuttons
builder.setPositiveButton(,newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intid){
//UserclickedOKbutton
}
});
builder.setNegativeButton(,newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intid){
//Usercancelledthedialog
}
});
//Setotherdialogproperties
...
//CreatetheAlertDialog
AlertDialogdialog=builder.create();
set…Button()方法需要一个按钮标题(由字符串资源提供)和一个DialogInterface.OnClickListener,后者用于定义用户按下该按钮时执行的操作。
您可以添加三种不同的操作按钮:
肯定
您应该使用此按钮来接受并继续执行操作(“确定”操作)。
否定
您应该使用此按钮来取消操作。
中性
您应该在用户可能不想继续执行操作,但也不一定想要取消操作时使用此按钮。
它出现在肯定按钮和否定按钮之间。
例如,实际操作可能是“稍后提醒我”。
对于每种按钮类型,您只能为AlertDialog添加一个该类型的按钮。
也就是说,您不能添加多个“肯定”按钮。
图3.一个包含标题和列表的对话框。
添加列表
可通过AlertDialogAPI提供三种列表:
传统单选列表
永久性单选列表(单选按钮)
永久性多选列表(复选框)
要想创建如图3所示的单选列表,请使用setItems()方法:
@Override
publicDialogonCreateDialog(BundlesavedInstanceState){
AlertDialog.Builderbuilder=newAlertDialog.Builder(getActivity());
builder.setTitle(
.setItems(,newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intwhich){
//The'which'argumentcontainstheindexposition
//oftheselecteditem
}
});
returnbuilder.create();
}
由于列表出现在对话框的内容区域,因此对话框无法同时显示消息和列表,您应该通过setTitle()为对话框设置标题。
要想指定列表项,请调用setItems()来传递一个数组。
或者,您也可以使用setAdapter()指定一个列表。
这样一来,您就可以使用ListAdapter以动态数据(如来自数据库的数据)支持列表。
如果您选择通过ListAdapter支持列表,请务必使用Loader,以便内容以异步方式加载。
使用适配器构建布局和加载程序指南中对此做了进一步描述。
注:
默认情况下,触摸列表项会清除对话框,除非您使用的是下列其中一种永久性选择列表。
图4.多选项列表。
添加永久性多选列表或单选列表
要想添加多选项(复选框)或单选项(单选按钮)列表,请分别使用setMultiChoiceItems()或setSingleChoiceItems()方法。
例如,以下示例展示了如何创建如图4所示的多选列表,将选定项保存在一个ArrayList中:
@Override
publicDialogonCreateDialog(BundlesavedInstanceState){
mSelectedItems=newArrayList();//Wherewetracktheselecteditems
AlertDialog.Builderbuilder=newAlertDialog.Builder(getActivity());
//Setthedialogtitle
builder.setTitle(
//Specifythelistarray,theitemstobeselectedbydefault(nullfornone),
//andthelistenerthroughwhichtoreceivecallbackswhenitemsareselected
.setMultiChoiceItems(,null,
newDialogInterface.OnMultiChoiceClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich,
booleanisChecked){
if(isChecked){
//Iftheusercheckedtheitem,addittotheselecteditems
mSelectedItems.add(which);
}elseif(mSelectedItems.contains(which)){
//Else,iftheitemisalreadyinthearray,removeit
mSelectedItems.remove(Integer.valueOf(which));
}
}
})
//Settheactionbuttons
.setPositiveButton(,newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intid){
//UserclickedOK,sosavethemSelectedItemsresultssomewhere
//orreturnthemtothecomponentthatopenedthedialog
...
}
})
.setNegativeButton(,newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intid){
...
}
});
returnbuilder.create();
}
尽管传统列表和具有单选按钮的列表都能提供“单选”操作,但如果您想持久保存用户的选择,则应使用{@,int,DialogInterface.OnClickListener)setSingleChoiceItems()}。
也就是说,如果稍后再次打开对话框时系统应指示用户的当前选择,那么您就需要创建一个具有单选按钮的列表。
创建自定义布局
如果您想让对话框具有自定义布局,请创建一个布局,然后通过调用AlertDialog.Builder对象上的setView()将其添加到AlertDialog。
默认情况下,自定义布局会填充对话框窗口,但您仍然可以使用AlertDialog.Builder方法来添加按钮和标题。
例如,以下是图5中对话框的布局文件:
res/layout/dialog_signin.xml
android:
orientation="vertical"
android:
layout_width="wrap_content"
android:
layout_height="wrap_content">
android: src="@drawable/header_logo" android: layout_width="match_parent" android: layout_height="64dp" android: scaleType="center" android: background="#FFFFBB33" android: contentDescription="@string/app_name"/> android: id="@+id/username" android: inputType="textEmailAddress" android: layout_width="match_parent" android: layout_height="wrap_content" android: layout_marginTop="16dp" android: layout_marginLeft="4dp" android: layout_marginRight="4dp" android: layout_marginBottom="4dp" android: hint="@string/username"/> android: id="@+id/password" android: inputType="textPassword" android: layout_width="match_parent" android: layout_height="wrap_content" android: layout_marginTop="4dp" android: layout_marginLeft="4dp" android: layout_marginRight="4dp" android: layout_marginBottom="16dp" android: fontFamily="sans-serif" android: hint="@string/password"/> 提示: 默认情况下,当您将EditText元素设置为使用“textPassword”输入类型时,字体系列将设置为固定宽度。 因此,您应该将其字体系列更改为“sans-serif”,以便两个文本字段都使用匹配的字体样式。 要扩展DialogFragment中的布局,请通过getLayoutInflater()获取一个LayoutInflater并调用inflate(),其中第一个参数是布局资源ID,第二个参数是布局的父视图。 然后,您可以调用setView()将布局放入对话框。 @Override publicDialogonCreateDialog(BundlesavedInstanceState){ AlertDialog.Builderbuilder=newAlertDialog.Builder(getActivity()); //Getthelayoutinflater LayoutInflaterinflater=getActivity().getLayoutInflater(); //Inflateandsetthelayoutforthedialog //Passnullastheparentviewbecauseitsgoinginthedialoglayout builder.setView(inflater.inflate(,null)) //Addactionbuttons .setPositiveButton(,newDialogInterface.OnClickListener(){ @Override publicvoidonClick(DialogInterfacedialog,intid){ //signintheuser... } }) .setNegativeButton(,newDialogInterface.OnClickListener(){ publicvoidonClick(DialogInterfacedialog,intid){ ; } }); returnbuilder.create(); } 提示: 如果您想要自定义对话框,可以改用对话框的形式显示Activity,而不是使用DialogAPI。 只需创建一个Activity,并在清单文件元素中将其主题设置为 theme="@android: style/"> 就这么简单。 Activity现在会显示在一个对话框窗口中,而非全屏显示。 将事件传递回对话框的宿主 当用户触摸对话框的某个操作按钮或从列表中选择某一项时,您的DialogFragment可能会自行执行必要的操作,但通常您想将事件传递给打开该对话框的Activity或片段。 为此,请定义一个界面,为每种点击事件定义一种方法。 然后在从该对话框接收操作事件的宿主组件中实现该界面。 例如,以下DialogFragment定义了一个界面,通过该界面将事件传回给宿主Activity: publicclassNoticeDialogFragmentextendsDialogFragment{ /*Theactivitythatcreatesaninstanceofthisdialogfragmentmust *implementthisinterfaceinordertoreceiveeventcallbacks. *EachmethodpassestheDialogFragmentincasethehostneedstoqueryit.*/ publicinterfaceNoticeDialogListener{ publicvoidonDialogPositiveClick(DialogFragmentdialog); publicvoidonDialogNegativeClick(DialogFragmentdialog); } //Usethisinstanceoftheinterfacetodeliveractionevents NoticeDialogListenermListener; //OverridetheFragment.onAttach()methodtoinstantiatetheNoticeDialogListener @Override publicvoidonAttach(Activityactivity){ super.onAttach(activity); //Verifythatthehostactivityimplementsthecallbackinterface try{ //InstantiatetheNoticeDialogListenersowecansendeventstothehost mListener=(NoticeDialogListener)activity; }catch(ClassCastExceptione){ //Theactivitydoesn'timplementtheinterface,throwexception thrownewClassCastException(activity.toString() +"mustimplementNoticeDialogListener"); } } ... } 对话框的宿主Activity会通过对话框片段的构造函数创建一个对话框实例,并通过实现的NoticeDialogListener界面接收对话框的事件: publicclassMainActivityextendsFragmentActivity implementsNoticeDialogFragment.NoticeDialogListener{ ... publicvoidshowNoticeDialog(){ //Cr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 对话框 Dialog 深度 剖析