Android开发实战(第五章)_第1页
Android开发实战(第五章)_第2页
Android开发实战(第五章)_第3页
Android开发实战(第五章)_第4页
Android开发实战(第五章)_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

与界面编程最紧密相关的知识就是事件处理了 当用户在程序界面上执行各种操作时 应用程序必须为用户动作提供响应 这种响应动作就需要通过事件处理来完成 在Android系统中提供了两种事件处理的方式 分别是基于回调的事件处理和基于监听器的事件处理 基于监听器的事件处理方式 先定义组件 然后为组件设定监听器 基于回调的事件处理方式 让每一个组件继承UI类 并重写该类的事件处理方法 当该组件遇到某事件时 即会触发相应的事件处理方法 Android事件处理 Chapter5 5 1 1监听处理模型中的三种对象 事件封装了界面组件上发生的特定事件的具体信息 如果监听器需要获取界面组件上所发生事件的相关信息 一般通过事件Event对象来传递 产生事件的来源 通常是各种组件 如按钮 窗口等 负责监听事件源发生的事件 并对不同的事件做相应的处理 在Android系统基于监听的事件处理模型中 主要涉及如下所示的三类对象 5 1 1监听处理模型中的三种对象 5 1 1监听处理模型中的三种对象 由此可见 基于监听器的事件处理机制是一种委派式Delegation的事件处理方式 事件源将整个事件委托给事件监听器 由监听器对事件进行响应处理 这种处理方式将事件源和事件监听器分离 有利于提供程序的可维护性 5 1 2Android系统中的监听事件 5 1 2Android系统中的监听事件 5 1 2Android系统中的监听事件 5 1 3实现事件监听器的方法 内部类形式 A B 外类类形式 C Activity本身作为事件监听器类 E 直接绑定到标签 D 匿名内部类形式 5 1 3实现事件监听器的方法 将事件监听器类定义在当前类的内部 如下所示 publicclassButtonTestextendsActivity protectedvoidonCreate BundlesavedInstanceState super onCreate savedInstanceState this setContentView R layout main Buttonbutton Button findViewById R id button MyButtonlistener newMyButton Button setOnClickListener listener classMyButtonimplementsOnclickListener publicvoidonClick Viewv System out println 内部类作为事件监听器 通过上述代码 将事件监听器类定义成当前类的内部类 通过使用内部类 可以在当前类中复用监听器类 另外 因为监听器类是外部类的内部类 所以可以自由访问外部类的所有界面组件 1 内部类形式 5 1 3实现事件监听器的方法 将事件监听器类定义成外部类形式 如下所示 ButtonTest类publicclassButtonTestextendsActivity protectedvoidonCreate BundlesavedInstanceState super onCreate savedInstanceState this setContentView R layout main Buttonbutton Button findViewById R id button MyButtonlistener newMyButton Button setOnClickListener new MyButtonListener 外部类作为事件监听器 MyButtonListener类classMyButtonListenerimplementsOnclickListener privateStringstr publicMyButtonListener Stringstr super this str str publicvoidonClick Viewv System out println str 2 外部类形式 5 1 3实现事件监听器的方法 当用户单击button按钮时 将会触发外部MyButtonListener类中的MyButtonListener监听器 使用外部类定义事件监听器的形式比较少见 主要因为如下两个原因 事件监听器通常属于特定的GUI界面 定义成外部类不利于提高程序的内聚性 外部类形式的事件监听器不能自由访问创建GUI界面的类中的组件 编程不够简洁 但是如果某个事件监听器确实需要被多个GUI界面所共享 而且主要是完成某种业务逻辑的实现 则可以考虑使用外部类的形式来定义事件监听器类 5 1 3实现事件监听器的方法 将Activity本身作为事件监听器类 如下所示 publicclassButtonTestextendsActivity protectedvoidonCreate BundlesavedInstanceState super onCreate savedInstanceState this setContentView R layout main Buttonbutton Button findViewById R id button Button setOnClickListener this publicvoidonClick Viewv System out println Activity本身作为事件监听器 Activity类实现了OnClickListener事件监听接口 从而可以在该Activity类中直接定义事件处理器方法onClick viewv 当为某个组件添加该事件监听器对象时 直接使用this作为事件监听器对象即可 3 外部类形式 5 1 3实现事件监听器的方法 可能造成程序结构混乱 Activity的主要职责应该是完成界面初始化 但此时还需包含事件处理器方法 从而引起混乱 如果activity界面类需要实现监听器接口 让人感觉比较怪异 这种使用activity本身作为监听器类的形式 可以直接在activity类中定义事件处理器 非常简洁 但有两个缺点 5 1 3实现事件监听器的方法 在Android应用程序中 因为可被复用的代码通常都被抽象成了业务逻辑方法 所以通常事件处理器都没有什么利用价值 大部分事件监听器只是临时使用一次 因此使用匿名内部类形式的事件监听器更合适 其实这种形式也是目前使用最广泛的事件监听器形式 如下所示 Buttonbutton Button findViewById R id button button setOnClickListener newOnClickListener PublicvoidonClick Viewv System out println 匿名内部类作为事件监听器 这种形式唯一的缺点就是匿名内部类的语法有点不易掌握 如果读者Java基础扎实 匿名内部类的语法掌握较好 通常建议使用匿名内部类作为监听器 4 使用匿名内部类创建事件监听器对象 5 1 3实现事件监听器的方法 其实在Android系统中还有一种更简单的绑定事件监听器的的方式 直接在界面布局文件中为指定标签绑定事件处理方法 Android系统中的很多标签都支持诸如onClick onLongClick等属性 这种属性的属性值是一个形如 xxx Viewsource 格式的方法 在布局文件中为button添加属性 如下所示 Buttonandroid layout width wrap content android layout height wrap content android text button android id id button android onClick clickHanlder 为Button按钮绑定一个事件处理方法 clickHanlder 这意味着开发者需要在该界面布局对应的Activity中定义一个voidclickHanler Viewsource 方法 该方法将会负责处理该按钮上的单击事件 5 直接绑定到标签 5 1 3实现事件监听器的方法 下面是该界面布局对应的java代码 publicclassButtonTestextendsActivity protectedvoidonCreate BundlesavedInstanceState super onCreate savedInstanceState this setContentView R layout main publicvoidClickHandler Viewsource System out println 直接绑定到标签 相比基于监听器的事件处理模型 基于回调的事件处理模型要简单些 该模型中 事件源和事件监听器是合一的 也就是说没有独立的事件监听器存在 当用户在GUI组件上触发某事件时 由该组件自身特定的函数负责处理该事件 通常通过重写Override组件类的事件处理函数实现事件的处理 该方法是接口KeyEvent Callback中的抽象方法 所有的View全部实现了该接口并重写了该方法 该方法用来捕捉手机键盘被按下的事件 下面列举几个Android中常用的回调方法 该方法同样是接口KeyEvent Callback中的一个抽象方法 并且所有的View同样全部实现了该接口并重写了该方法 onKeyUp方法用来捕捉手机键盘按键抬起的事件 该方法在View类中的定义 并且所有的View子类全部重写了该方法 应用程序可以通过该方法处理手机屏幕的触摸事件 手机中轨迹球的处理方法 所有的View同样全部实现了该方法 提示 以上方法的返回值为一个boolean类型的变量 当返回true时 表示已经完整地处理了这个事件 并不希望其他的回调方法再次进行处理 而当返回false时 表示并没有完全处理完该事件 更希望其他回调方法继续对其进行处理 例如Activity中的回调方法 该方法是焦点改变的回调方法 当某个控件重写了该方法后 当焦点发生变化时 会自动调用该方法来处理焦点改变的事件 onFocusChanged只能在View中重写 5 3 1实例目标 在开发Android应用程序时 有时候可能需要让应用程序随着系统的整体设置进行调整 例如判断当前设备的屏幕方向 另外 有时还需要让应用程序能够随时监听系统设置的变化 以便对系统的修改动作进行响应 5 3 2具体实现 android layout width fill parent android layout height fill parent 1 编写布局文件main xml 在该界面中仅包含一个普通按钮 具体实现代码如下 LinearLayoutxmlns android android orientation vertical 本实例的具体实现流程如下 5 3 2具体实现 下面编写Java程序文件ChangeCfg java 调用Activity的setRequestedOrientation int 方法来动态更改屏幕方向 并且重写Activity的onConfigurationChanged ConfigurationnewConfig 方法 具体实现代码如下 publicclassChangeCfgextendsActivity OverridepublicvoidonCreate BundlesavedInstanceState 2 在Android应用程序中 为了动态地更改系统设置 可调用Activity的setRequestedOrientation int 方法来修改屏幕方向 如果在Android应用程序中需要监听系统设置的更改状况 可以通过重写Activity中的onConfigurationChanged ConfigurationnewConfig 方法实现 此方法是一个基于回调的事件处理方法 当系统设置信息发生改变时 onConfigurationChanged方法会被自动触发 5 3 2具体实现 如果当前是横屏if config orientation Configuration ORIENTATION LANDSCAPE 设为竖屏ChangeCfg this setRequestedOrientation ActivityInfo SCREEN ORIENTATION PORTRAIT 如果当前是竖屏if config orientation Configuration ORIENTATION PORTRAIT super onCreate savedInstanceState setContentView R layout main Buttonbn Button findViewById R id bn 为按钮绑定事件监听器bn setOnClickListener newOnClickListener OverridepublicvoidonClick Viewsource Configurationconfig getResources getConfiguration 5 3 2具体实现 super onConfigurationChanged newConfig Stringscreen newConfig orientation Configuration ORIENTATION LANDSCAPE 横向屏幕 竖向屏幕 Toast makeText this 系统的屏幕方向发生改变 n修改后的屏幕方向为 screen Toast LENGTH LONG show 设为横屏ChangeCfg this setRequestedOrientation ActivityInfo SCREEN ORIENTATION LANDSCAPE 重写该方法 用于监听系统设置的更改 主要是监控屏幕方向的更改 OverridepublicvoidonConfigurationChanged ConfigurationnewConfig 5 3 2具体实现 在文件AndroidManifest xml中设置该Activity可以监听屏幕方向改变的事件 这样当程序改变手机屏幕方向时 Activity的onConfigurationChanged 方法就会被回调 具体实现代码如下 3 另外 为了让该Activity能监听屏幕方向更改的事件 需要在配置该Activity时指定android configChanges属性 android configChanges属性支持的属性值有mcc mnc locale touchscreen keyboard keyboardHidden navigation orientation screenLayout uiMode screenSize smallestScreenSize fontScale 其中orientatio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论