Android开发入门之-Layout
Layouts
定义UI中的可视结构,如App和widget可以在XML和java中同时定义,一般来说使用XML定义可以做到界面与控制分离。也可以在XML中定义默认格式,在运行中用java来改变它,这涉及到View和Viewgroup类。一般来说XML的元素与类对应,而XML的属性则与方法对应,名字都相分直观,偶尔稍有差异,如EditText中的text属性对应java中EditText.setText().
编写XML
与HTML十分类似,使用嵌套的方式可以快速定义界面。
每个布局有一个root element,必须是View或者ViewGroup。root element之下可以加入其它layout对象或者widget来构造完整布局。
|
|
其中LinearLayout extends ViewGroup,将文件以xml后缀保存到res/layout目录下以编译。
加载xml资源
每个xml都被编译为一个View资源,应该在java中的onCreate()方法中使用setContentView(R.layout.xml_filename)加载
属性
每个View和ViewGroup都有自己的属性,有些View有特有的属性,属性也可以被子类继承。有一些称为“布局参数Layout Parameters”的属性用来描述View对象的布局方位,定义于其所属父ViewGroup中。
ID
xml中使用唯一String来赋值id属性,编译后在View对象中以数字ID表示,作为其在树中的唯一标识
|
|
@符号告诉解析器这是一个ID字串,+表示这是一个新建资源需要添加到R.java,android框架还提供一些其它资源,当引用资源时,不需要+符号,但是需要指定包命名空间
|
|
android包命名空间指定是android.R资源类,而不是本地资源类。
常用方法是在xml中如此定义
|
|
然后在java中这样引用,通常是在onCreate()中
|
|
在RelativeLayout中,View之间相互引用定位,因此定义和使用ID十分重要。id只需要在所搜寻的tree中唯一即可,当然通常也是全树,所以最好是唯一的。
Layout Parameters
形如layout_xxx的属性定义View在ViewGroup中的方位。每个ViewGroup类都有一个继承于ViewGroup.LayoutParams的嵌套内部类,定义child在ViewGroup中能使用的方位参数。

layout_width 和layout_height是所有ViewGroup共有和必须定义的。一般不会使用数值来赋值,而是以下常量
-wrap_content 适应内容
-match_parent 父ViewGroup能允许的最大值。
pixel也不推荐使用,使用density-independent pixel units (dp)代替。
方位
View的占位都是矩形的。位置由left top坐标定义,大小由width height定义,单位是pixel。
坐标可通过getLeft() 和getTop()获得,都是相对父ViewGroup的值,同时也提供getRight() 和getBottom()来避免手工计算。
大小、填充与边框
实质有两组大小参数measured width 和measured height,以及width 和height有时也叫drawing width 和drawing height.
getMeasuredWidth() 和getMeasuredHeight()得到其在父元素中能达到的大小。getWidth() 和getHeight()则表示实际在屏幕上的绘图大小,两者可以设定为相同值。
通过setPadding(int, int, int, int) 方法和getPaddingLeft(),getPaddingTop(),getPaddingRight() 和 getPaddingBottom()可以设定和查询填充的大小。
view不提供margin参数,但是ViewGroup有ViewGroup.MarginLayoutParams参数。
常见布局
Layout可以嵌套,但原则上嵌套会使渲染变慢,所以应使层次尽量简单。
Linear Layout
横向或纵向排列,超出屏幕大小会生成滚动条
Relative layout
通过指定View之间与View与父元素之间的相对关系来定位
Web Layout
显示网页
适配器
当内容动态或未定时,可以继承AdapterView以在运行时定义布局。AdapterView的子类使用adapter绑定布局数据,就像数据源与adapterView间的第三人一样,它从数据源(如数据库)中读取数据,并将其转换为View添加到AdapterView中。
AdapterView支持的常见布局有List View : 单列Grid View : 表格
为AdapterView填充数据
可通过绑定list view 或grid view到Adapter来填充AdapterView,adapter从外部读取数据并为第一个数据项生成view。
Android提供若干不同的Adapter来适应不同的数据。
ArrayAdapter
toString()为每个数组元素生成一个TextView
|
|
然后用setAdapter()将其绑定到ListView
如果想要定制每项的外观,可以override数组元素的toString(). 如果想要生成TextView之外的View,可以继承ArrayAdapter并override其getView()方法。
SimpleCursorAdapter
一般当数据是数据库查询结果cursor(可随机存取)时使用。需要指定每行记录使用的layout以及每列数据插入哪个View。例如对一个包含人名与号码等信息的电话薄数据。
|
|
第一项指定要显示哪些内容(列),第二项指定数据显示在哪些View中。
|
|
如果使用的数据发生了变化,可以调用notifyDataSetChanged()来通知adapter重新渲染。
处理点击事件
可为adapterView的每项View添加处理方法,方式为实现接口AdapterView.OnItemClickListener
