本文是对Android中对话框使用的详细分析和介绍,供大家参考。
对话框是任何系统都必须拥有的控件。作为一个辅助窗口,它用于显示一些消息或要求用户采取行动。安卓也不例外。有关基本用法,请参见文档。使用时的注意事项1.back键可以取消对话框(dissolve),但是不会触发它的onOkey和onCancel回调接口,所以如果你的对话框会改变一些状态,一定要注意还有第三种方法可以取消对话框。2.尽量少用模态对话框。如果Dialog.setCancellable(false,则成为模态对话框,除了在程序内部解除它之外,不能通过按任何键来取消它。这是非常差的用户体验。对话框本身就是一种干扰,再取消不了会把用户逼疯。所以,模态对话框只有在特别必要的情况下才可以使用,也就是你不想在执行一个操作的时候被打破。3.尽量少用对话框,对用户来说是一种干扰,除非要求用户做操作或者做选择。通常一般的通知,敬酒或者通知就够了。4.不要用对话式的活动,也就是把活动变成对话。因为这是自定义布局,所以可能与系统对话框的风格不一致。最严重的是,当系统风格改变时,Dialog的子类会改变,但Activity dialog不会改变。你可以在ICS中寻找活动对话框,你会发现它的ok在左边,而ICS中系统对话框的OK都在右边。5.尽量保证Dialog对象活在Activity的生命周期内,也就是最多在onCreate()和onDestroy()之间。6.思考并测试Activity在它的dialog . dissolve()之前就终止的情况。因为活动必须附加到显示的活动实例上,所以在显示和取消时,其活动实例必须存在,否则会出现“IllegalArgumentException:view not attached to window manager”。复制代码如下:05-15 02:45:26.320:E/Android Runtime(1161):Java . lang . illegalargumentexception:视图未附加到窗口管理器05-15 02:45:26.320:E/Android Runtime(1161):at Android . view . windowmanagerimpl . findviewlocked(windowmanagerimpl . Java:355)05-15 02:45:26.320:E三种使用方式比较1.直接创建本地对话框对象的好处是变量是本地的,易于理解和维护。缺点是对话框对象难以控制,容易造成RuntimeException。2.将对话框对象更改为活动的域优势在于,对话框对象可以重用,并且可以控制活动以确保对话框不会在活动的生命周期之外显示。是推荐的使用方式。3.使用Activity的方法onCreateDialog()、showDialog()和dismissDialog()的优点是框架将帮助照看对话框,这是大多数情况下的推荐做法。但是,当活动死得早的时候,这个方法肯定有RuntimeException,也是避免不了的。示例代码如下:公共类dialog demo扩展activity { private static final int miss _ dialog=1;
私有进度对话框mBetterDialogprivate Handler mMainHandler=new Handler(){ @ override public void handle Message(Message msg){ switch(msg。what){ case dissolve _ DIALOG:DIALOG=(DIALOG)msg。obj对话。dissolve();打破;默认:break } } }@ Override protected void onCreate(Bundle savedInstanceState){ super。onCreate(savedInstanceState);设置内容视图(r .布局dialog _ demo);
最终按钮sucking=(Button)findViewById(r . id。吮吸);sucking.setOnClickListener(新视图onClick listener(){ public void onClick(View v){ final Activity Activity=dialog demo。这个;最终进度对话框dialog=新进度对话框(活动);dialog.setTitle('最差的对话');dialog.setMessage('这是最糟糕的对话模式,永远不要使用它。此对话框很容易"耗尽其附加的活动,如果活动在解散时消失了,则产生窗口管理器# BadTokenException ");对话。设置不确定(真);对话。setcancelable(true);//必须在主线程anywaydialog.show()中做显示新线程(new Runnable(){ public void run(){系统时钟。睡眠(10000));/* * IllegalArgumentException:视图未附加到窗口管理器*如果显示对话框的活动在溶解()停止旋转或更改区域设置之前被终止,*对话框将与活动一起消失,但当溶解()产生" IllegalArgumentException:视图未附加到*窗口管理器"时。*检查isShowing()没有帮助。*检查activity.isFinishing()也无济于事。*在主线程中驳回它也不会给任何帮助。*///这样不行//if(对话框。正在显示()){//对话框。disse();//}//if(!活动。正在整理()){//对话框。disse();//}消息msg=消息。获取();msg . what=dismisse _ dialogmsg . obj=dialogmmainhandler。发送消息(msg);}}).start();}});
final Button better=(Button)findViewById(r . id。更好);better.setOnClickListener(新视图onClick listener(){ public void onClick(View v){ mBetterDialog=new progress dialog(对话框演示。这个);mbetterdialog。settitle(“更好的对话”);mBetterDialog.setMessage('可以使用此对话。对话框对象是其活动的一个字段,因此活动可以"控制它以确保对话框只存在于活动生命周期内");mbetterdialog。设置不确定(真);mbetterdialog。setcancelable(true);//必须在主线程anywaymBetterDialog.show()中做显示新线程(new Runnable(){ public void run(){系统时钟。睡眠(10000));/* *这要好得多,mBetterDialog是其活动的一个字段,因此活动可以处理它,以便*确保对话只存在于活动的生命周期内,以避免任何意外的异常。*///如果(mBetterDialog!=空mbetter对话框。正在显示()){ mbetter对话框。disse();} }}).start();}});
final Button可选=(Button)findViewById(r . id。可选);optional.setOnClickListener(新视图onClick listener(){ @ suppress warnings(' deprecation ')public void onClick(View v){ showDialog(0);新线程(new Runnable(){ public void run(){系统时钟。睡眠(10000));/* *这种方式在大多数情况下最有效,除非活动在关闭前死亡,否则必须*抛出异常:“IllegalArgumentException:视图未附加到窗口管理器”.*尽管活动负责其所属的对话框,但无法再手动操作它。*首先,您没有对对话框对象的引用,其次,任何手动操作只会干扰*和破坏由框架维护的状态. dismissDialog(0);}}).start();}});} @ Override protected Dialog oncreate Dialog(int id){ progress Dialog d=new progress Dialog(this);d.setTitle('可选对话');d.setMessage('这种对话模式在大多数情况下效果最好,对话都由活动和框架负责' '。除了在对话框显示")"期间被终止的活动;d .设定不定(真);d . setcancelable(真);返回d;} @覆盖受保护的destroy上的void(){ super。on destroy();//活动正在死亡,其所有所属的对话框都应该被解除,当然,if (mBetterDialog!=空mbetter对话框。正在显示()){ mbetter对话框。disse();mBetterDialog=null}//对于通过showDialog(int)显示的对话框,在onDestroy()//dismissDialog(0)中没有办法停止;//导致“IllegalArgumentException:从未通过活动#showDialog显示身份证明(identification)为0的对话框"//这是因为活动必须在onPause()和onResume()期间管理其对话框,以还原//对话框的状态。所以如果你在onDestroy()中手动解除它,就会引起JE .
//删除对话框(0);//原因" IllegalArgumentException:未通过活动#showDialog显示任何身份证明(identification)为0的对话框",当//在线程中关闭时。//这是因为活动必须在onPause()和onResume()期间管理其对话框,以恢复//对话框的状态。所以如果你在onDestroy()中手动解除它,就会引起JE .}}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。