最新版南方双彩网:Android系统原理与源码分析
本文摘要:众所周知,AlertDialog类对于表明对话。
众所周知,AlertDialog类对于表明对话。关于AlertDialog的基本用法在这里就不详尽讲解了,网上有很多,读者可以自己搜寻。
那么本文要讲解的是如何随心所欲地掌控AlertDialog。 现在我们来想到第一个市场需求:如果某个应用于必须弹头出有一个对话框。
当单击确认按钮时已完成某些工作,如果这些工作告终,对话框无法重开。而当顺利已完成工作后,则重开对话框。当然,无论何程度情况,单击中止按钮都会重开对话框。
这个市场需求并不简单,也并不过分(虽然我们可以自己摸个Activity来已完成这个工作,也可在View上自己敲按钮,但这表明有些大炮打蚊子了,如果对话框上只有一行文本,酬劳这么多劲过于不值了)。但用于过AlertDialog的读者都告诉,无论单击的哪个按钮,无论按钮单击事件的继续执行情况如何,对话框是认同要重开的。也就是说,用户无法控制对话框的重开动作。
实质上,重开对话框的动作早已在AndroidSDK写死了,并且并未给使用者尚存任何模块。但我的座右铭是宇宙中没什么是无法掌控的。 既然要掌控对放框的重开不道德,首先就得分析是哪些类、哪些代码使这个对话框重开的。转入AlertDialog类的源代码。
在AlertDialog中只定义了一个变量:mAlert。这个变量是AlertController类型。
AlertController类是Android的内部类,在com.android.internal.app包中,无法通过普通的方式采访。也无法在Eclipse中通过按Ctrl键追踪入源代码。但可以必要在Android源代码中寻找AlertController.java。
我们再行返回AlertDialog类中。AlertDialog类实质上只是一个架子。象设置按钮、设置标题等工作都是由AlertController类已完成的。
因此,AlertController类才是关键。 寻找AlertController.java文件。关上后不要深感头晕哦,这个文件中的代码是很多地。不过这么多代码对本文的主题也没什么用处。
下面就去找一下掌控按钮的代码。 在AlertController类的结尾就不会看见如下的代码: View.OnClickListenermButtonHandler=newView.OnClickListener(){ publicvoidonClick(Viewv){ Messagem=null; if(v==mButtonPositivemButtonPositiveMessage!=null){ m=Message.obtain(mButtonPositiveMessage); }elseif(v==mButtonNegativemButtonNegativeMessage!=null){ m=Message.obtain(mButtonNegativeMessage); }elseif(v==mButtonNeutralmButtonNeutralMessage!=null){ m=Message.obtain(mButtonNeutralMessage); } if(m!=null){ m.sendToTarget(); } //Postamessagesowedismissaftertheabovehandlersareexecuted mHandler.obtainMessage(ButtonHandler.MSG_DISMISS_DIALOG,mDialogInterface) .sendToTarget(); } }; 从这段代码中可以猜出来,前几行代码用来启动时对话框中的三个按钮(Positive、Negative和Neutral)的单击事件,而最后的代码则用来重开对话框(因为我们找到了MSG_DISMISS_DIALOG、猜出来的)。 mHandler.obtainMessage(ButtonHandler.MSG_DISMISS_DIALOG,mDialogInterface) .sendToTarget(); 上面的代码并不是必要来重开对话框的,而是通过一个Handler来处置,代码如下: privatestaticfinalclassButtonHandlerextendsHandler{ //ButtonclickshaveMessage.whatastheBUTTON{1,2,3}constant privatestaticfinalintMSG_DISMISS_DIALOG=1; privateWeakReference《DialogInterface》mDialog; publicButtonHandler(DialogInterfacedialog){ mDialog=newWeakReference《DialogInterface》(dialog); } @Override publicvoidhandleMessage(Messagemsg){ switch(msg.what){ caseDialogInterface.BUTTON_POSITIVE: caseDialogInterface.BUTTON_NEGATIVE: caseDialogInterface.BUTTON_NEUTRAL: ((DialogInterface.OnClickListener)msg.obj).onClick(mDialog.get(),msg.what); break; caseMSG_DISMISS_DIALOG: ((DialogInterface)msg.obj).dismiss(); } } } 从上面代码的最后可以寻找 ((DialogInterface)msg.obj).dismiss();。现在看了这么多源代码,我们来总结一下对话框按钮单击事件的处理过程。
在AlertController处置对话框按钮时会为每一个按钮加到一个onclick事件。而这个事件类的对象实例就是上面的mButtonHandler。
在这个单击事件中首先不会通过发送到消息的方式调用为按钮设置的单击事件(也就是通过setPositiveButton等方法的第二个参数设置的单击事件),在启动时完了按钮的单击事件后,不会通过发送到消息的方式调用dismiss方法来重开对话框。而在AlertController类中定义了一个全局的mHandler变量。
在AlertController类中通过ButtonHandler类来对象来为mHandler赋值。因此,我们只要用于我们自己Handler对象更换ButtonHandler就可以制止调用dismiss方法来重开对话框。下面再行在自己的程序中创建一个新的ButtonHandler类(也可叫其他的名)。 classButtonHandlerextendsHandler { privateWeakReference《DialogInterface》mDialog; publicButtonHandler(DialogInterfacedialog) { mDialog=newWeakReference《DialogInterface》(dialog); } @Override public voidhandleMessage(Messagemsg) { switch(msg.what) { caseDialogInterface.BUTTON_POSITIVE: caseDialogInterface.BUTTON_NEGATIVE: caseDialogInterface.BUTTON_NEUTRAL: ((DialogInterface.OnClickListener)msg.obj).onClick(mDialog .get(),msg.what); break; } } } 我们可以看见,上面的类和AlertController中的ButtonHandler类很像,只是支掉了switch语句的最后一个case子句(用作调用dismiss方法)和涉及的代码。
本文关键词:南方双彩,正版南方双彩网,老版南方双彩2024,南方双彩网官网app,最新版南方双彩网
本文来源:南方双彩-www.nrc-e.com