Contents
  1. 1. Layouts
  2. 2. 编写XML
  3. 3. 加载xml资源
  4. 4. 属性
  5. 5. ID
  6. 6. Layout Parameters
  7. 7. 方位
  8. 8. 大小、填充与边框
  9. 9. 常见布局
    1. 9.1. Linear Layout
    2. 9.2. Relative layout
    3. 9.3. Web Layout
  10. 10. 适配器
  11. 11. 为AdapterView填充数据
    1. 11.1. ArrayAdapter
  12. 12. SimpleCursorAdapter
  13. 13. 处理点击事件

Layouts

定义UI中的可视结构,如Appwidget可以在XMLjava中同时定义,一般来说使用XML定义可以做到界面与控制分离。也可以在XML中定义默认格式,在运行中用java来改变它,这涉及到ViewViewgroup类。一般来说XML的元素与类对应,而XML的属性则与方法对应,名字都相分直观,偶尔稍有差异,如EditText中的text属性对应javaEditText.setText().

编写XML

HTML十分类似,使用嵌套的方式可以快速定义界面。

每个布局有一个root element,必须是View或者ViewGrouproot element之下可以加入其它layout对象或者widget来构造完整布局。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a TextView" />
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a Button" />
</LinearLayout>

其中LinearLayout extends ViewGroup,将文件以xml后缀保存到res/layout目录下以编译。

加载xml资源

每个xml都被编译为一个View资源,应该在java中的onCreate()方法中使用setContentView(R.layout.xml_filename)加载

1
2
3
4
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
}

属性

每个ViewViewGroup都有自己的属性,有些View有特有的属性,属性也可以被子类继承。有一些称为“布局参数Layout Parameters”的属性用来描述View对象的布局方位,定义于其所属父ViewGroup中。

ID

xml中使用唯一String来赋值id属性,编译后在View对象中以数字ID表示,作为其在树中的唯一标识

1
android:id="@+id/my_button"

@符号告诉解析器这是一个ID字串,+表示这是一个新建资源需要添加到R.javaandroid框架还提供一些其它资源,当引用资源时,不需要+符号,但是需要指定包命名空间

1
android:id="@android:id/empty"

android包命名空间指定是android.R资源类,而不是本地资源类。

常用方法是在xml中如此定义

1
2
3
4
<Button android:id="@+id/my_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/my_button_text"/>

然后在java中这样引用,通常是在onCreate()

1
Button myButton = (Button) findViewById(R.id.my_button);

RelativeLayout中,View之间相互引用定位,因此定义和使用ID十分重要。id只需要在所搜寻的tree中唯一即可,当然通常也是全树,所以最好是唯一的。

Layout Parameters

形如layout_xxx的属性定义ViewViewGroup中的方位。每个ViewGroup类都有一个继承于ViewGroup.LayoutParams的嵌套内部类,定义childViewGroup中能使用的方位参数。

layout_widthlayout_height是所有ViewGroup共有和必须定义的。一般不会使用数值来赋值,而是以下常量

-wrap_content 适应内容
-match_parentViewGroup能允许的最大值。

pixel也不推荐使用,使用density-independent pixel units (dp)代替。

方位

View的占位都是矩形的。位置由left top坐标定义,大小由width height定义,单位是pixel

坐标可通过getLeft()getTop()获得,都是相对父ViewGroup的值,同时也提供getRight()getBottom()来避免手工计算。

大小、填充与边框

实质有两组大小参数measured widthmeasured height,以及widthheight有时也叫drawing widthdrawing height.

getMeasuredWidth()getMeasuredHeight()得到其在父元素中能达到的大小。getWidth()getHeight()则表示实际在屏幕上的绘图大小,两者可以设定为相同值。

通过setPadding(int, int, int, int) 方法和getPaddingLeft(),getPaddingTop(),getPaddingRight()getPaddingBottom()可以设定和查询填充的大小。

view不提供margin参数,但是ViewGroupViewGroup.MarginLayoutParams参数。

常见布局

Layout可以嵌套,但原则上嵌套会使渲染变慢,所以应使层次尽量简单。

Linear Layout

横向或纵向排列,超出屏幕大小会生成滚动条

Relative layout

通过指定View之间与View与父元素之间的相对关系来定位

Web Layout

显示网页

适配器

当内容动态或未定时,可以继承AdapterView以在运行时定义布局。AdapterView的子类使用adapter绑定布局数据,就像数据源与adapterView间的第三人一样,它从数据源(如数据库)中读取数据,并将其转换为View添加到AdapterView中。

AdapterView支持的常见布局有
List View : 单列
Grid View : 表格

为AdapterView填充数据

可通过绑定list viewgrid viewAdapter来填充AdapterView,adapter从外部读取数据并为第一个数据项生成view

Android提供若干不同的Adapter来适应不同的数据。

ArrayAdapter

toString()为每个数组元素生成一个TextView

1
2
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, myStringArray);

然后用setAdapter()将其绑定到ListView

1
2
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);

如果想要定制每项的外观,可以override数组元素的toString(). 如果想要生成TextView之外的View,可以继承ArrayAdapteroverridegetView()方法。

SimpleCursorAdapter

一般当数据是数据库查询结果cursor(可随机存取)时使用。需要指定每行记录使用的layout以及每列数据插入哪个View。例如对一个包含人名与号码等信息的电话薄数据。

1
2
3
String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER};
int[] toViews = {R.id.display_name, R.id.phone_number};

第一项指定要显示哪些内容(列),第二项指定数据显示在哪些View中。

1
2
3
4
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.person_name_and_number, cursor, fromColumns, toViews, 0);
ListView listView = getListView();
listView.setAdapter(adapter);

如果使用的数据发生了变化,可以调用notifyDataSetChanged()来通知adapter重新渲染。

1
2
myStringList.add(text);
adapter.notifyDataSetChanged();

处理点击事件

可为adapterView的每项View添加处理方法,方式为实现接口AdapterView.OnItemClickListener

1
2
3
4
5
6
7
8
// Create a message handling object as an anonymous class.
private OnItemClickListener mMessageClickedHandler = new OnItemClickListener() {
public void onItemClick(AdapterView parent, View v, int position, long id) {
// Do something in response to the click
}
};
listView.setOnItemClickListener(mMessageClickedHandler);

Contents
  1. 1. Layouts
  2. 2. 编写XML
  3. 3. 加载xml资源
  4. 4. 属性
  5. 5. ID
  6. 6. Layout Parameters
  7. 7. 方位
  8. 8. 大小、填充与边框
  9. 9. 常见布局
    1. 9.1. Linear Layout
    2. 9.2. Relative layout
    3. 9.3. Web Layout
  10. 10. 适配器
  11. 11. 为AdapterView填充数据
    1. 11.1. ArrayAdapter
  12. 12. SimpleCursorAdapter
  13. 13. 处理点击事件