Dialog学习笔记

Dialog概要

【简介】Dialog是出现在当前Activity前方的一个小窗口,会获得用户的焦点。通常用于需要打断用户的通知,执行与应用程序进展直接相关的短暂任务。
【创建】一个Dialog可以被看成一个Activity的一部分,通常在Activity的onCreateDialog(int)中创建。在此方法中创建的Dialog会自动属于此Acitivity,并继承其一部分属性,比如在激活Dialog的时候Menu键会打开为这个Activity定义的optionsMenu。如果在此方法外面创建DIalog,那么它对Activity是不可见的,可用setOwnerActivity(Activity)进行附着。
【显示】有两种方法来显示。第一种从Activity的角度,调用showDialog(int),根据传进去的int对相应Dialog进行创建或者更新,然后显示。如果希望每次打开Dialog之前都修改他的属性,那么需要override回调函数onPrepareDialog(int, Dialog)。第二种是从Dialog本身的角度,调用show()。
【解散】解散一个Dialog同样可以从两个角度出发。从Activity,可以调用dismissDialog(int),对于在onCreateDialog()中创建的Dialog,Activity会保存其状态,如果不希望保存,可调用removeDialog(int)方法,他会清除Dialog的内在关联。其次,从Dialog考虑,可以调用dismiss()或者cancel(),区别在于dismiss()内会用到onDismissListener(),cancel()内会调用dismiss(),还会调用onCancelListener(),物理按键back调用的是cancel()。

练习三种Dialog
Dialog类是创建Dialog的基础类,但通常不会直接实例化它,而是使用它的子类,常用的AlertDialog,ProgressDialog,DatePickerDialog,TimePickerDialog,也可以订制自己的Dialog。我写了一个小程序,练习了AlertDialog,ProgressDialog和自定义Dialog。
【主菜单】点击开始按钮后,弹出主菜单,主菜单有三个选项,Alert,Progress和Custom。主菜单本身是用AlertDialog实现,下方没有Button,上方有title和退出按钮,也可通过物理按键back退出,content的部分用setItems()展示一个列表,每个选项选中后弹出相应的Dialog。
【Alert】对AlertDialog的练习是一个简易的加法计算器,用setMultiChoiceItems()展示三个CheckBox,选中以后,点击下方的Button,将选中的值的和Toast出来。没有调用removeDialog()因此再次进入的时候,会保存上次选中的值。【注意】在AlertDialog中,List和Message不能同时显示,如需此效果,可以使用自定义的Dialog。
【Progress】ProgressDialog用于显示进度,具体有两种,一种以一个滚动的轮子的形式,一种以进度条的形式。首先,用一个AlertDialog显示有这两种选项,用setSingleItems()以RadioButton的形式展示,下方有两个按钮,分别表示确定和取消。进入第一个按钮【wheel】,直接用ProgressDialog.show(Context,CharSequence,CharSequence,boolean)返回一个ProgressDialog,设置其可退出及退出监听器,就可以展示一个进度轮了。进入第二个按钮【bar】,首先new一个ProgressDialog,然后setProgressStyle()设置为ProgressDialog.STYLE_HORIZONTAL,这样就会以进度条的形式出现而不是进度轮,然后设置其可退出,调用show(),再setProgress()。【注意】此处在show()之前setProgress()是无效的,必须先show()再setProgress()。
【Custom】使用了两种方法来实现自定义Dialog。【第一种】是通过Dialog来做,这种情况下,标题栏一定会存在,如果标题为空,标题栏所占的空间依然会存在。首先创建一个Dialog,然后getLayoutInflater()获取缩放器inflater,调用inflater.inflate(int ResId,ViewGroup root)对我们自定义的布局文件进行缩放并返回,被缩放后的布局文件就可以被setContentView()了,设置好布局文件后就能findViewById来获取控件并进行设置了,最后调用dialog的show()进行展示。【第二种】是通过AlertDialog来做,这样如果标题为空,那么它不会继续占用空间。首先创建AlertDialog.Builder,然后同样获得inflater对布局文件进行缩放,与上面不同的是,这里不再调用dialog的setContentView(),而是调用builder的setView()方法,之后同样地获取和设置控件,最后调用builder的()和alertDialog继承的show()显示出来,当然也可以采用其他的显示方法。【注意】按Dev Guide中那样,直接把自己的布局文件设置为Dialog的布局,是无法获取其中的控件的,必须先用Inflater进行缩放在设置为布局。

AlertDialog详解

【结构】AlertDialog继承Dialog,实现了DialogInterface接口,组合了一个AlertController成员对象,包含一个静态内部类Builder。
【创建步骤】
	【构造器】首先创建一个AlertDialog.Builder类的实例builder,在builder的构造方法中会创建AlertController的静态内部类AlertParams的实例P。
	【设置】然后调用builder的一些列set()方法设置想要的特性,这些set()方法中将会把这些特性设置到P中。注意Builder的set()方法都可以进行链式编程。
	【创建】再调用builder的create()方法,在这个方法中将会构建一个AlertDialog的实例dialog,而dialog的构造方法中又会创建一个AlertController实例mAlert,然后通过P的apply()方法,把先前设置到P中的特性都设置到mAlert中。由于showCancel只是设置了Title栏的cancel,所以接下来再通过setCancelable()和setOnCancelListener()设置一下物理按键的cancel。
	【展示】调用builder的show()方法,在这个方法中,先调用create,再调用dialog继承自Dialog的show()方法。
在继承自Dialog的show()方法里,先调用同样是继承的dispatchOnCreate,在里面调用了自己复写的onCreate方法。
在onCreate方法里,调用了mAlert.installContent,其中,先设置好布局文件,然后setupView,包括setupContent,setupButtons,setupTitle,setBackground,注册布局里的控件及其属性。【注意】show()方法会重新创建AlertDIalog和AlertController对象,原来会被舍弃。
	【其他展示方法】除了调用Builder的show()方法之外,还可以调用AlertDialog继承自Dialog的show()方法,还可以调用Activity的showDialog()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值