Dialogs(对话框)
2016-07-22 20:35
274 查看
概述
对话框是一个小的窗口用以提示用户做出决定或输入额外的信息。对话框不会填满屏幕并且通常被用作模态事件,要求用户做出行动才能继续下去。对话框设计:关于如何设计你的对话框,包括一些建议,请阅读
AlertDialog
一个可以展示标题,三个按钮,可选择项的列表或自定义布局的对话框。
orDatePickerDialog
TimePickerDialog
一个使用预先定义好的UI,允许用户选择一个日期或时间的对话框
避免使用ProgressDialog
安卓包含了一个名为
&Activity的设计指导,并且在你的布局中使用
这些类为你的对话框定义了样式和结构,但是你应为你的对话框该使用
使用
这篇文章接下来的章节描述了如何结合一个
对象来使用AlertDialog
注:因为该
Library提供的。在你的应用中加入该库,你可以使用
11或更高,你可以在使用框架版本的
而不是
android.app.DialogFragment.。
创建对话框碎片(DialogFragment)
你可以实现一个广义上的对话框设计——包括自定义布局和在例如,这里有个基本的
:管理的:DialogFragment
publicclassFireMissilesDialogFragmentextendsDialogFragment{
@Override
publicDialogonCreateDialog(BundlesavedInstanceState){
//UsetheBuilderclassforconvenientdialogconstruction
AlertDialog.Builderbuilder=newAlertDialog.Builder(getActivity());
builder.setMessage(R.string.dialog_fire_missiles)
.setPositiveButton(R.string.fire,newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intid){
//FIREZEMISSILES!
}
})
.setNegativeButton(R.string.cancel,newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intid){
//Usercancelledthedialog
}
});
//CreatetheAlertDialogobjectandreturnit
returnbuilder.create();
}
}[/code]
现在,当你创建了一个该类的引用并且在该对象中调用了
下面的章节描述了更多关于使用
取决于如何组合你的对话框,你可以实现
创建警告对话框(AlertDialog)
dialog上有三个区域:
1.标题
这是一个可选项并且仅当内容被详细消息,一个列表或自定义布局占用时使用。如果你希望说明一个简单的消息或问题(例如图1的对话框),则不需要标题。
2.内容区域
这里可以展示消息,列表或其它自定义不布局
3.操作按钮
在一个对话框中不超过个三个操作按钮
为创建一个
::AlertDialog
//1.通过它的构造器实例化一个AlertDialog.Builder
AlertDialog.Builderbuilder=newAlertDialog.Builder(getActivity());
//2.将设置方法都集合在一起来设置对话框的属性
builder.setMessage(R.string.dialog_message)
.setTitle(R.string.dialog_title);
//3.从create()中获得AlertDialog
AlertDialogdialog=builder.create();[/code]
接下来的话题展示了如何定义不同的属性,通过使用
添加按钮
添加按钮变为图2所示,调用和setPositiveButton()
setNegativeButton()方法
:
AlertDialog.Builderbuilder=newAlertDialog.Builder(getActivity());
//Addthebuttons
builder.setPositiveButton(R.string.ok,newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intid){
//UserclickedOKbutton
}
});
builder.setNegativeButton(R.string.cancel,newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intid){
//Usercancelledthedialog
}
});
//Setotherdialogproperties
...
//CreatetheAlertDialog
AlertDialogdialog=builder.create();[/code]
set...Button()methods方法请求一个按钮的标题(由string资源文件提供)和一个
,该监听器定义了当用户点击该按钮时的操作。DialogInterface.OnClickListener
这里有三种不同的操作按钮可以添加:
Positive
你可以使用它来执行同样和继续操作("OK'按钮)
Negative
你可以使用它来执行取消操作
Neutral
你应该在用户可能不希望继续操作时使用这个,但并不是一定要取消。它显示在postive和negative按钮之间。例如,该操作获取是“之后再提醒我”
这三种操作按钮可以都添加一个在
.中。也就是说,不能有多个“positive”按钮。AlertDialog
添加列表
在
一个传统的单选列表
一个持续的单选列表(单选按钮)
一个持续的多选列表(复选框)
//持续的说明可以保存选项
像图3一样创建衣服单选列表,使用
@Override
publicDialogonCreateDialog(BundlesavedInstanceState){
AlertDialog.Builderbuilder=newAlertDialog.Builder(getActivity());
builder.setTitle(R.string.pick_color)
.setItems(R.array.colors_array,newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intwhich){
//which变量包含了被选中项的索引值
}
});
returnbuilder.create();
}[/code]
因为列表是显示在对话框的文本区,对话框无法同时显示一个消息和列表,并且你应该为对话框设置标题,通过
如果你选择用
,返回你的列表,经常使用一个ListAdapter
LayoutswithanAdapter和
注:默认的,触摸一个列表项将会消失该对话框,除非你使用一个持久的选择列表。
添加一个持久的复选/单选列表
为了添加一个持续的复选项(checkbox)或单选项(radiobutton),分别使用
或setMultiChoiceItems()
方法。setSingleChoiceItems()
例如,这里展示了如何创建一个像图4一样的复选列表,并且存储了被选中项在
:中:ArrayList
@Override
publicDialogonCreateDialog(BundlesavedInstanceState){
mSelectedItems=newArrayList();//跟踪被选项的地方
AlertDialog.Builderbuilder=newAlertDialog.Builder(getActivity());
//设置对话框标题
builder.setTitle(R.string.pick_toppings)
//指定列表数组,默认被选中项t(nullfornone),和选择项目时的监听器
.setMultiChoiceItems(R.array.toppings,null,
newDialogInterface.OnMultiChoiceClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich,
booleanisChecked){
if(isChecked){
//如果用户选中了项目,将它加入被选择项
mSelectedItems.add(which);
}elseif(mSelectedItems.contains(which)){
//否则,如果项目已经在数组中,移除它
mSelectedItems.remove(Integer.valueOf(which));
}
}
})
//Settheactionbuttons
.setPositiveButton(R.string.ok,newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intid){
//用户点击OK,因此建议mSelectedItems结果存储在某处,或者从打开的对话框中返回它们。
//orreturnthemtothecomponentthatopenedthedialog
...
}
})
.setNegativeButton(R.string.cancel,newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intid){
...
}
});
returnbuilder.create();
}[/code]
尽管传统的列表和有单选按钮的列表都提供了"单选"操作,你可以使用
创建自定义布局(CustomLayout)
如果你想在对话框中自定义布局,创建一个布局并且在你的
来添加进去。setView()
默认的,自定义布局填充该对话框窗口,但是你仍可以使用
例如,这里有个如图5所示的布局文件:
res/layout/dialog_signin.xml
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
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"/>
<EditText
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"/>
<EditText
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"/>
</LinearLayout>[/code]
技巧:默认的,当你设置
在你的
并且调用LayoutInflater
@Override
publicDialogonCreateDialog(BundlesavedInstanceState){
AlertDialog.Builderbuilder=newAlertDialog.Builder(getActivity());
//Getthelayoutinflater
LayoutInflaterinflater=getActivity().getLayoutInflater();
//Inflateandsetthelayoutforthedialog
//Passnullastheparentviewbecauseitsgoinginthedialoglayout
builder.setView(inflater.inflate(R.layout.dialog_signin,null))
//Addactionbuttons
.setPositiveButton(R.string.signin,newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intid){
//signintheuser...
}
})
.setNegativeButton(R.string.cancel,newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intid){
LoginDialogFragment.this.getDialog().cancel();
}
});
returnbuilder.create();
}[/code]
技巧:如果你想要自定义对话框,你可以使用一个
<activity>配置元素中设置它的主题为
:Theme.Holo.Dialog
<activityandroid:theme="@android:style/Theme.Holo.Dialog">[/code]
传递事件出去给对话框持有者
当用户触摸对话框中的一个操作按钮或从列表中选择一个项目时,你的例如,这里有个
,定义了一个接口,通过它传递事件给持有者的activity:DialogFragment
publicclassNoticeDialogFragmentextendsDialogFragment{
/*创建该对话框碎片引用的activity必须实现该接口,为了收到事件回调*每一个需要传递的方法需都需要声明它*/
publicinterfaceNoticeDialogListener{
publicvoidonDialogPositiveClick(DialogFragmentdialog);
publicvoidonDialogNegativeClick(DialogFragmentdialog);
}
//使用该接口的实例来传递操作事件
NoticeDialogListenermListener;
//重写Fragment.onAttach()方法来实例化NoticeDialogListener
@Override
publicvoidonAttach(Activityactivity){
super.onAttach(activity);
//验证持有者的activity实现了回调接口
try{
//InstantiatetheNoticeDialogListenersowecansendeventstothehost
mListener=(NoticeDialogListener)activity;
}catch(ClassCastExceptione){
//Theactivitydoesn'timplementtheinterface,throwexception
thrownewClassCastException(activity.toString()
+"mustimplementNoticeDialogListener");
}
}
...
}[/code]
持有该对话框的activity用对话框fragment构造器创建一个该对话框的引用,并且通过NoticeDialogListener接口接收该对话框的事件:
publicclassMainActivityextendsFragmentActivity
implementsNoticeDialogFragment.NoticeDialogListener{
...
publicvoidshowNoticeDialog(){
//创建一个dialogfragment引用并且展示它
DialogFragmentdialog=newNoticeDialogFragment();
dialog.show(getSupportFragmentManager(),"NoticeDialogFragment");
}
//dialogfragment通过Fragment.onAttach()回调返回一个参数给改activity,它被用来调用如下方法,这些方法定义在NoticeDialogFragment.NoticeDialogListener接口
@Override
publicvoidonDialogPositiveClick(DialogFragmentdialog){
//Usertouchedthedialog'spositivebutton
...
}
@Override
publicvoidonDialogNegativeClick(DialogFragmentdialog){
//Usertouchedthedialog'snegativebutton
...
}
}[/code]
因为持有者activity实现了NoticeDialogListener——被
publicclassNoticeDialogFragmentextendsDialogFragment{
...
@Override
publicDialogonCreateDialog(BundlesavedInstanceState){
//Buildthedialogandsetupthebuttonclickhandlers
AlertDialog.Builderbuilder=newAlertDialog.Builder(getActivity());
builder.setMessage(R.string.dialog_fire_missiles)
.setPositiveButton(R.string.fire,newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intid){
//Sendthepositivebuttoneventbacktothehostactivity
mListener.onDialogPositiveClick(NoticeDialogFragment.this);
}
})
.setNegativeButton(R.string.cancel,newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intid){
//Sendthenegativebuttoneventbacktothehostactivity
mListener.onDialogNegativeClick(NoticeDialogFragment.this);
}
});
returnbuilder.create();
}
}[/code]
显示对话框
当你想要显示你的对话框时,创建一个你的,show()
传递一个
和该dialogFragmentManager
fragment的标签名。
你可以通过调用
从getFragmentManager()
publicvoidconfirmFireMissiles(){
DialogFragmentnewFragment=newFireMissilesDialogFragment();
newFragment.show(getSupportFragmentManager(),"missiles");
}[/code]
第二个参数,“missiles”,是一个唯一的标签名,系统用来需要时保存和存储fragment状态。该标签允许你通过fragment调用
.来获得。findFragmentByTag()
显示一个全屏的对话框或者嵌入的碎片
你或许有一个UI设计,想要将UI划片,在一些情况下显示一个对话框,但是像全屏或在其它中嵌入片段(或许取决于设备是大屏幕或者小屏幕)。类提供你这些易用性,因为它仍可以像一个可嵌入的片段一样。DialogFragment
但是,在这种情况下,你不能使用
中加载该布局。onCreateView()
这里有一个
publicclassCustomDialogFragmentextendsDialogFragment{
/**系统调用该方法来获得DialogFragment's布局,不关心是否是作为一个对话框显示还是可嵌入的碎片*/
@Override
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
//Inflatethelayouttouseasdialogorembeddedfragment
returninflater.inflate(R.layout.purchase_items,container,false);
}
/**系统调用该方法,仅当创建对话框布局时*/
@Override
publicDialogonCreateDialog(BundlesavedInstanceState){
//你必须覆盖该方法的唯一原因就是当使用onCreateView()来更改任何对话框属性时。例如,对话框默认包含一个标题,但是你的自定义布局或许不需要它。因此你可以移除对话框标题,但是你必须调用父类来获得该对话框。
Dialogdialog=super.onCreateDialog(savedInstanceState);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
returndialog;
}
}[/code]
这里有一段决定了是作为对话框显示的fragment或者全屏UI,基于屏幕大小:
publicvoidshowDialog(){
FragmentManagerfragmentManager=getSupportFragmentManager();
CustomDialogFragmentnewFragment=newCustomDialogFragment();
if(mIsLargeLayout){
//Thedeviceisusingalargelayout,soshowthefragmentasadialog
newFragment.show(fragmentManager,"dialog");
}else{
//Thedeviceissmaller,soshowthefragmentfullscreen
FragmentTransactiontransaction=fragmentManager.beginTransaction();
//Foralittlepolish,specifyatransitionanimation
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
//Tomakeitfullscreen,usethe'content'rootviewasthecontainer
//forthefragment,whichisalwaystherootviewfortheactivity
transaction.add(android.R.id.content,newFragment)
.addToBackStack(null).commit();
}
}[/code]
更多关于fragment转换的信息,请查看
在该案例中,mIsLargeLayout布尔值指定了设备是否使用的是大布局设计(并且在这上面显示对话框为fragment,否则便是全屏)。最好设置该布尔型的方法就是用alternative
resource值为不同大小的屏幕声明一个布尔资源文件(bool
resourcevalue)。例如,这里为不同屏幕大小声明了两种布尔资源:
res/values/bools.xml
<!--Defaultbooleanvalues-->
<resources>
<boolname="large_layout">false</bool>
</resources>[/code]
res/values-large/bools.xml
<!--Largescreenbooleanvalues-->
<resources>
<boolname="large_layout">true</bool>
</resources>[/code]
之后你可以在activity的
booleanmIsLargeLayout;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mIsLargeLayout=getResources().getBoolean(R.bool.large_layout);
}[/code]
一个activity作为对话框显示在大屏幕上
当在小屏幕上时,显示一个对话框作为全屏的UI,在大屏幕上,你可以通过显示一个activity作为一个对话框来实现相同的效果。选择哪种方法取决于你的应用设计,但是将activity作为对话框显示是十分实用的,当你的应用准备在小屏幕上设计时,并且你想改进在平板上的体验,通过显示一个短生命周期的activity来作为对话框。为了将activity作为对话框来显示在大屏幕上,在
应用<activity>配置元素中
<activityandroid:theme="@android:style/Theme.Holo.DialogWhenLarge">[/code]
更多关于你的activity主题样式的信息,请查看Styles
andThemes开发向导。
消散(dismissing)你的对话框
当用户点击任何创建按钮通过当用户点击一个对话框列表中的某一项时,系统也会消散该对话框,除非列表使用的是单选按钮(radiobutton)或复选框(checkbox)。否则,你可以在你的
.中调用DialogFragment
来手工的消散你的对话框。dismiss()
万一你需要执行某些操作,当对话框消失时,你可以在你的
.中实现DialogFragment
你也可以取消(cancel)一个对话框。这是一个特别的事件,表明用户显示的离开了对话框并且没有完成任务。如果用户点击Back按钮或点击对话框外的区域时就会发生此类事件,或者如果你在对话框中显示的调用
”按钮)。
如上文示例说展示的,你可以通过在你的
注:在每个事件调用
。然而,如果你调用onDismiss()
或Dialog.dismiss()
systemDialogFragment.dismiss(),
系统调用
。dismiss()
相关文章推荐
- MooBox 基于Mootools的对话框插件
- 基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
- C#实现在前端网页弹出警告对话框(alert)的方法
- Android开发必知 九种对话框的实现方法
- Android中创建对话框(确定取消对话框、单选对话框、多选对话框)实例代码
- Android列表对话框用法实例分析
- C#使用Word中的内置对话框实例
- MFC对话框中添加状态栏的方法
- php结合安卓客户端实现查询交互实例
- jquery实现点击弹出可放大居中及关闭的对话框(附demo源码下载)
- 基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
- JavaScript弹出对话框的三种方式
- 用JavaScript实现对话框的教程
- Asp.net 弹出对话框基类(输出alet警告框)
- js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
- boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
- 自制轻量级仿jQuery.boxy对话框插件代码
- jQuery代码实现对话框右上角菜单带关闭×
- 基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
- 安卓输入框被虚拟键盘挡住的问题(微信开发)