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