<疯狂Android讲义>阅读笔记(2)

来源:互联网 发布:神奈川有什么大学知乎 编辑:程序博客网 时间:2024/06/10 03:43
滚动视图scrollview的功能和用法
scrollview由Framelayout派生而出,它就是一个用于为普通组件添加滚动条的组件。scrollview里最多只能包含一个组件,而scrollview的作用就是为该组件添加垂直滚动条。
simpleadapter:第二个参数应该是一个List<?extends Map<string,?>>类型的集合对象,该集合中每个map<string,?>对象生成一个列表项。第三个参数制定一个界面布局的id.例如此处指定了第五个参数中的界面组件就来自该界面布局。第四个参数,该参数应该是一个string[]类型的参数,该参数决定提取Map<string,?>对象中那些Key对应的value来生成列表想。第五个参数:该参数应该是int[]类型的参数,该参数决定使用哪些view组件来组合成一个列表项。
ExpandableListView是listview的子类,它在普通listView的基础上进行了扩展,它把应用中的列表项分为机组,每组里又可包含多个列表项。

TextView直接继承了View,还派生出了Button类。
TextView的属性 autolink none不设置任何超链接。web:将文本中的url地址转换为超链接。
email:将文本中的email地址转换为超链接。phone将文本中的电话号码转换为超链接。
map:将文本中的街道地址转换为超链接。all相当于指定web,email,map,phone。

Android:ellipsize属性可支持如下几个属性值。none:不进行任何处理。start:在本文开头部分进行省略。middle:在文本中间部分进行省略、end:在文本结尾处进行省略。marquee:在文本结尾处以淡出的方式省略。

ImageView支持的xml属性及相关方法的说明
adjustViewBounds 设置imageview是否调整自己的边界来保持所显示图片的长宽比。
setsacletype设置所显示的图片如何缩放或移动以适应Imageview的大小。
matrix:使用matrix方式进行缩放。
fitXY:对图片横向,纵向独立缩放,使得该图片完全适应已于该imageview,图片纵横比可能会改变。fitstart:保持纵横比缩放图片,直到该图片能完全显示在imageview中,缩放完成后将该图片放在imgaeview的左上角。fitcenter:保持纵横比缩放图片,直到该图片能完全显示在imageview中,缩放完成后将该图片放在imageview的中央。fitend:保持纵横比缩放图片,直到该图片能完全显示在Imageveiw中,缩放完成后,将该图片放在imageview的右下角。center:把图片放在imageview的中间,但不进行任何缩放。centercorp:保持纵横比缩放图片,以使得图片能完全覆盖imageview。
centerinside:保持纵横比缩放图片,以使得imageview能完全显示该图片。

progressbar的功能和用法
属性:
max 最大进度值。progress:已完成进度值  progressDrawable 设置该进度条的轨道的绘制形式。
progressBarStyle:默认进度条形式。

上面的程序调用了TabHost.TabSpec对象的setContent(int viewId)方法来设置标签页内容;除此之外还可调用setcontent(Intent intent)方法来设置标签页内容。

ScrollView的功能和用法
滚动视图ScrollView由Framelayout派生而出,它就是一个用于为普通组件添加滚动条的组件。ScrollView最左只能包含一个组件,而ScrollView的作用就是为该组件添加垂直滚动条。

GridView和Listview有共同的父类:AbslistView,GridView和ListView的主要区别在于,ListView只是在一个方向上分部,而GridView则会在两个方向上分布。
ImageSwitcher由Framelayout派生而出,ImageSwitcher组件和ImageView很相似,它们都可以用于显示图片,但ImageSwitcher比ImageView多一个功能呢,它所显示的图片切换时可以设置动画效果。

Gallery与Spinner两个组件有共同的父类,Abspinner,表明Gallery和Spinner都是一个列表框。它们之间的区别在于Spinner显示的是一个垂直的列表选择框,而Gallery显示的是一个水平的列表选择框。Gallery和Spinner还有一个区别,Spinner的作用是供用户选择,而Gallery则允许用户通过拖动来查看上一下,下一个列表项。

popupwindow
调用popupwindow的构造器创建popupwindow对象。调用popupwindow对象的showasdropdown将popupwindow作为v组件的下拉组件显示出来,或调用popupwindow的showatlocation方法将popupwindow在指定位置显示出来。

Android提供了强大的事件处理机制,包括两套事件处理机制:
1、基于监听的事件处理。2、基于回调的事件处理。
对于Android基于回调的事件处理而言,主要做法就是重写安卓组件特定的回调方法,或者重写activity的回调方法,安卓为绝大部分界面组件都提供了事件响应的回调方法,开着只要重写它们即可。
一般来说,基于会掉的事件处理可用于处理一些具有通用型的事件。基于回调的事件处理代码会显得特别间接,但对于某些特定的事件,无法使用基于回调的事件处理,只能采用基于监听的事件处理。

基于监听的事件处理
基于监听的事件处理是一种更面向对象的事件处理。
事件监听的处理模型:
1、eventsource (事件源):事件发生的场所,通常是各个组件,例如按钮、窗口、菜单等。
2、Event(事件):事件封装了界面组件上发生的特定事情。如果程序需要获得界面组件上所发生事件的相关信息,一般通过event对象来获得。
3、eventlistener(事件监听器):负责监听事件源所发生的事件,并对各种事件做出相应的响应。
java是面向对象的变成语言,方法是不能独立存在的,所以必须以类的形式来组织这些方法,所以事件监听器的核心就是它所包含的方法,这些方法也被成为事件处理器。
当用户按下一个按钮或者单击某个菜单项时,这些动作就会激发一个相应的事件,该事件就会触发事件源上注册的事件监听器,事件监听器调用对应的事件处理器(事件监听器的实例方法)来作出相应的响应。
安卓的事件处理机制是一种委派式事件处理方式:普通组件将整个事件处理委托给特定的对象;当该事件源发生指定的时间时,就通知所委托的事件监听器,由事件监听器来处理这个事件。
委派式事件处理方法明显抄袭了人类社会的分工协作。

安卓对事件监听模型做了进一步简化:如果事件源触发的事件足够简单,事件里封装的信息比较有限,那就无须封装事件对象,将事件对象传入事件监听器。
但对于键盘事件、触摸屏事件等,此时程序需要获取事件发生的详细信息:例如键盘事件需要获取是哪个键触发的事件;触摸屏事件需要获取事件发生的位置等,对于这种包含更多信息的事件,安卓同样会将事件信息封装成xxxevent对象,并把对象作为参数传入事件处理器。

在基于事件监听的处理模型中,事件监听器必须实现事件监听器接口,Android为不同的界面组件提供了不同的监听接口,这些接口通常以内部类的形式存在。以View类为例,它包含了如下几个内部接口:
1、view.onclicklistener:单击事件的事件监听器必须实现的接口。
2、view.oncreatcontextmenulistener:创建上下文菜单事件的事件监听器必须实现的接口
3、view.onfocuschangelistener:焦点必须改变事件的事件监听器必须实现的接口。
4、view.onkeylistener:按键事件的事件监听器必须实现的接口。
事件处理模型简化成如下理解:当事件源组件上发生事件时,系统将会执行该事件源上监听器的对应处理方法。与普通java方法调用不同的是:普通java程序里的方法右程序主动调用的,事件处理中的事件处理方法由系统负责调用。

通过上面的介绍不难看出,所谓的事件监听器,其实就是实现了特定接口的java类的实例。在程序中实现事件监听器,通常有如下几种形式。
1、内部类形式:将事件监听器定义成当前类的内部类。
2、外部类形式:将事件监听器定义成一个外部类。
3、activity本身作为事件监听器类:让activity本身实现监听器接口,并实现事件处理方法。
4、匿名内部类形式:使用匿名内部类创建事件监听器对象。

Activity本身作为事件监听器
这种形式使用activity本身作为监听器,可以直接在activity类中定义事件处理器方法
缺点:
1、这种形式可能造成程序结构混乱,activity的主要职责应该是完成界面初始化工作,但此时还需要包含处理器方法,从而引起混乱。
2、如果activity界面类需要实现监听器接口,让人感觉比较怪异。

匿名内部类作为事件监听器
大部分时候,事件处理器都没有复用价值。因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适。

基于回调的事件处理
如果说事件监听机制是一种委托式的事件处理,那么回调机制则恰好与之相反;对于基于回调的事件处理模型来说,事件源与事件监听器是统一的,或者说事件监听器完全消失了。当用户在GUI组件上激发某个事件时,组件自己特定的方法将会负责处理该事件。
为了使用回调机制类处理GUI组件上所发生的事件,我们需要为该组件提供对应的事件处理方法—而java是一种静态语言,我们无法为某个对象动态地添加方法,因此只能继承GUI组件类,并重写该类的事件处理方法来实现。
为了实现回调机制的事件处理,安卓为所有GUI组件都提供了一些事件处理方法,以View为例,该类包括如下方法:
boolean onkeydown(int keycode,keyevent event):当用户在该组件上按下某个按键时触发该方法。
boolean onkeypress(int keycode,keyevent event ):当用户在该组件上长按下某个按键时触发该方法。

对于基于监听的事件处理模型来说,事件源和事件监听器是分离的,当事件源上发生特定事件之后,该事件交给事件监听器负责处理;对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,当事件源发生特定时间之后,该事件还是由事件源本身负责处理。

几乎所有基于回调的事件处理方法都有一个boolean类型的返回值,该返回值用于标识该处理方法是否能完全处理该事件:
1、如果处理事件的回调方法返回true,表明该处理方法已完全处理该事件,该事件不会传播出去。
2、如果处理事件的回调方法返回false,表明该处理方法并未完全处理该事件,该事件会传播出去。
对于基于回调的事件传播而言,某组件上所发生的事情不仅激发该组建上的回调方法,也会触发该组件所在activity的回调用法—只要事件能传播到activity。
安卓系统最先会触发的是该按键上绑定的事件监听器,接着才触发该组件提供的事件回调方法,然后还会传播到该组件所在的activity。

重写ontouchevent方法响应触摸屏事件
对于安卓提供的两种事件处理模型,不难发现基于坚挺的事件处理模型具有更大的优势
1、基于监听的事件模型分工更明确,事件源、事件监听由辆各类分开实现,因此具有更好的可维护性。
2、安卓的事件处理机制保证基于监听的事件监听器会被优先触发。

但某些情况下,基于回调的事件处理机制会更好的提供程序的内聚性。
基于回调的事件处理更适合于应付那种事件处理逻辑比较固定的View。

响应的系统设置的事件
在开发安卓应用时,有时可能需要让应用程序随系统设置而进行调整,比如判断系统的屏幕方向,判断系统方向的导航设备等。除此之外,有时候可能还需要让应用程序监听系统设置的更改。



graphic
0 0