FROM:http://developer.android.com/guide/topics/ui/declaring-layout.html#Position
一 布局位置
视图的外观形状是一个长方形。一个视图有一个位置,这个位置用<左,顶>坐标表示,两个维度,表示为宽和高。位置和维度的单位是像素。
通过调用getLeft()和getTop()方法可以重新获取视图的位置。前者返回左侧或代表视图的矩形坐标X。后者返回顶部或Y代表视图的矩形坐标Y。这些方法,返回视图相对于它的父视图的相关位置。例如,当getLeft()返回20,这个意思是位从它的父视图的左侧开始起向右20个像素的位置。
另外,还有若干的方法被提供避免不需要的计算,也就是getRight()和getBotton()。
二 Size, Padding and Margins
用宽和高表示视图的大小。一个视图实际上拥有两组宽和高的值。
第一组值被称之为测量宽和测量高。这些尺寸定义在父视图中的多大的视图,这个测量的尺寸通过调用getMeasuredWidth()函数和getMeasuredHeight()函数获得。
第二组被称之为宽和高,有时称为绘制宽度和绘制高度。这个尺寸定义视图在屏幕上的确实尺寸,这两个值不同与测量宽度和测量高度。通过调用getWidth()和getHeight()函数可以获得宽度和高度。
为了测量它的尺寸,考虑其填充视图。填充用像素表示。填充可以被用作补偿视图的内容,通过一个特殊的像素补偿视图的内容。设置填充可以使用setPadding(int, int, int, int)方法和需要通过调用getPaddingLeft(),getPaddingTop(),getPaddingRight(),getPaddingBottom()。
虽然,一个视图可以定义一个填充,它没有提供热和MARGIN的支持。可是ViewGroup提供了这个支持。查看ViewGroup和ViewGroup.MarginLayoutParams获取更多的信息。
三 常见布局
每个ViewGroup的子类提供了一个唯一的方式展示你的想法。下面是一些常见的布局类型,这些被构建在安装框架中。
LinearLayout组织它的孩子到一个单独的水平的或垂直的行中。如果他的窗口长度超过屏幕的长度,它创建一个滚动条。
RelativeLayout使你能够指定子对象彼此相对的位置,或父对象彼此相对的位置。
WebView 显示Web页面
四 用一个适配器构建布局
当你的布局的内容是动态的或没有预先定义的,你可以使用一个布局,它的子类AdapterView在运行时产生一个视图。AdapterView的一个子类使用一个Adapter去构建数据。Adapter的行为向一个数据源和AdapterView布局的中间人,Adapter取回数据和转换每个填充到视图中。
常见的布局Adapter包括:
ListView:显示一个滚动栏的单个列表清单
Grid View:显示一个滚动栏的网格行和列
五 用数据填充适配器
通过绑定AdapterView实例到适配器,你可以填充一个AdapterView的ListView或GridView,从外部获取数据,并创建一个视图表示每个数据项。
安卓提供了几种Adapter的几个子类,这个写子类对获取不同种类数据和为一个AdapterView构建视图非常有用。两个常见的适配器是:
ArrrayAdapter
当你的数据源是一个队列使用这个适配器。默认下ArrayAdapter通过调用toString()为每个队列项创建一个视图并且替换TextView中的内容。
例如,如果你有一个字符串的队列,你想显示他们到listView,初始化一个新的ArrayAdapter,使用一个构造器去指定每个字符串和字符串队列的布局:
ArrayAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myStringArray);这个构造函数的参数是:
1)你的应用程序的Context
2)布局队列中的每个字符串包含一个TextView
3)字符串队列
然后在你的ListView上调用setAdapter()函数
ListView listView = (ListView) findViewById(R.id.listview); listView.setAdapter(adapter);为了定制每个项的外观,你可以在你的队列中的对象上重写toString()方法。或为每个项创建一个视图,(例如你想为每个队列项创建一个ImageView),扩展ArrayAdapter类和重写getView()去为每个项返回一个你想要的视图。
SimpleCursorAdapter
当你的数据来源于一个Cursor,使用这个适配器。当使用SimpleCursorAdapter,你必须为每个行指定一个布局去使用。例如你想创建一个人们的名字和电话号码的列表,你能可以执行一个问题,它返回一个Cursor,为每个人包含一行名字和号码。你可以创建一个字符串队列。
String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER}; int[] toViews = {R.id.display_name, R.id.phone_number};当你构造SimpleCursorAdapter,传递到布局,Cursor包含这个结果,
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.person_name_and_number, cursor, fromColumns, toViews, 0); ListView listView = getListView(); listView.setAdapter(adapter);六 处理点击事件
通过实现一个AdapterView.OnItemClickListener接口,你可以为每个项的点击事件做响应,例如:
// 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);