说明:本文是我自己对官方入门教程(Training)的翻译,仅仅是为了记录自己的学习过程。由于本人英语水平太低,基本上是靠金山词霸加上自己的理解,所以翻译的不好。如果你有好的意见请留言,谢谢!
布局(Layouts)
一个布局定义了用户界面的视觉结构,如activity或应用程序部件的UI。你可以使用以下两种方式来定义一个布局:
- 在XML声明UI元素。Android提供了一个简明的XML词汇,对应于的视图(View)类和子类,诸如窗体和布局。
- 在运行时初始化布局元素。你的应用程序可以以编程的方式创建View和ViewGroup对象(和操作它们的属性)。
Android框架能够让你灵活地使用一个或多个方法来声明和管理你的应用程序UI。例如,你可以在XML声明你的应用程序的默认布局,包括显示在屏幕上的元素及其属性。然后你可以在应用程序中添加代码,在运行时动态地改变屏幕对象的状态,包括那些在XML中声明的对象。
在XML中定义UI的好处是它可以使你更好的将应用程序的外观表现与控制行为的代码分离开来。你的UI描述独立于你的应用程序代码,这意味着你可以修改或适应它,而不必改动你的源代码并重新编译。例如,您可以为不同的屏幕方向,不同设备的屏幕尺寸,不同的语言分别创建XML布局。此外,在XML中定义布局更容易可视化呈现你的用户界面结构,这样很容易调试问题。因此,本文件的重点是教你如何在XML声明你的布局。如果你对在运行时实例化视图对象感兴趣,请参照ViewGroup和View类的参考文档。
在一般情况下,XML词汇中声明UI元素紧密遵循类和方法的结构和命名,元素名称对应的类名称和属性名称对应方法。事实上,对应的往往是如此直接,你可以猜到的XML属性对应到一个类的方法,或猜类对应于一个给定的XML元素。然而,值得注意的是,并不是所有的词汇都是相同的。在某些情况下,有轻微的命名差异。例如,EditText元素有一个text属性,对应着EditText.setText()。
提示:想要了解更多关于不同布局类型的知识可以查看Common Layout Objects。那里也有一些在Hello Views教程中创建不同布局的示范。
编辑XML(Write the XML)
使用Android的XML词汇,你可以快速地设计出UI布局以及它所包含的屏幕元素,这就像是使用HTML(一系列嵌套的元素)来编写网页一样。
每个布局文件都必须确切地包含一个根元素,它必须是一个View或ViewGroup对象。一旦你定义了根元素,你可以添加额外的布局对象或窗体作为子元素,逐步建立,定义你的布局视图层次。例如,这里有一个XML布局,采用垂直LinearLayout,包含一个TextView和一个按钮:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_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>
当你在XML中声明了布局之后,就可以以.xml后缀保存为文件,存放在你的Android工程目录下res/layout/目录中,这样它将正确编译。
更多有关XML布局文件的语法可以查看Layout Resources文档。
加载XML资源(Load the XML Resource)
当你编译你的应用程序时,每个XML布局文件被编译成一个视图(View)资源。你应该从你的应用程序代码加载布局资源,在Activity.onCreate()回调函数中实现。具体的是通过调用setContentView(),以R.layout.layout_file_name的形式来引用布局资源。例如,如果你的XML布局保存为main_layout.xml,你在Activity中像这样的形式加载它:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
}
当你的Activity加载时,Android框架就会调用Activity里的onCreate()回调函数(具体可以查询Activity生命周期的文档)。
属性(Attributes)
每个View和ViewGroup对象都支持自己的各种XML属性。有些属性是视图对象特有的(例如,TextView支持textSize属性),但这些属性也可以扩展这个类的任何视图对象继承。一些对于所有View对象是常见的,因为他们是从根视图类继承(如ID属性)。和其他的属性,都被认为是“布局参数,”这是描述视图对象的某个布局方向属性,如对象的父亲ViewGroup对象定义。
ID
任何视图(View)对象可能有一个与它关联的整数ID,唯一地标识该视图。当应用程序被编译时,这个ID被当作整数来引用,但在XML布局文件中ID属性里则是一个字符串。这是一个所有的视图对象都有XML属性(由视图类定义),你会经常用到它。在一个XML标签中ID的语法是:
android:id="@+id/my_button"
在符号(@)在字符串的开头显示XML解析器应该解析和扩大ID字符串的休息和识别它作为一个ID资源。加号(+),这是一个新的资源名称,必须创建和添加到我们的资源(在R.java文件)。还有一些其他的ID资源,通过Android框架提供了。引用一个Android资源ID时,你不需要加符号,但必须加入Android包的命名空间,像这样:
android:id="@android:id/empty"
因为这里有Android包的命名空间,所以我们从android.R资源类中引用一个ID,而不是本地的资源类。
为了创建视图并在应用程序中引用,一种常用的方式是:
1.在布局文件中定义一个视图或者部件,并给它指定一个唯一的ID:
<Button android:id="@+id/my_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/my_button_text"/>
2.然后,创建视图对象的实例,从布局中获取到它(一般是在onCreate()方法中)
Button myButton = (Button) findViewById(R.id.my_button);
在创建RelativeLayout时,为视图对象定义ID是很重要的。在RelativeLayout布局中,sibling view可以通过检索ID来找到与之相伶的sibling view,定义他们的布局。
ID不需要在整个视图树中唯一,但至少在你检索的部分内是唯一的(不过通常总是全局的,所以最好尽可能唯一)。
布局参数(Layout Parameters)
XML布局属性命名为layout_something,定义了在ViewGroup中的视图布局参数。
每一个ViewGroup类都实现了一个嵌套类,用以扩展ViewGroup.LayoutParams。这个子类包含属性类型,其定义每个子视图的大小和位置,以适应视图组(ViewGroup)。正如你在图1中所看到的,父视图组(ViewGroup)为每一个子视图定义了布局参数(包括子视图组)。
图1。一个视图层次结构的可视化呈现,其中包含有每一个视图的布局参数。
注意每个LayoutParams子类都有自己设定值的语法。每个子元素必须定义LayoutParams以适当其父,即使它也可以为自己的孩子定义不同的LayoutParams。
所有的视图组都包括一个宽度和高度(layout_width和layout_height),并且每一个视图都被要求定义它们。许多LayoutParams还包括可选的边缘和边框。
你可以指定宽度和高度的精确尺寸,不过你可能不想经常这么做。更多的时候,你将使用下面这些常量来设置宽度或高度:
- wrap_content 告诉视图自己去适应其内容
- fill_parent (在API Level 8中已经重命名为match_parent了)让视图尽可能达到其父视图组允许的最大尺寸
在一般情况下,指定一个布局的宽度和高度,使用绝对单位如像素不推荐。相反,使用相对测量,如密度无关的像素单位(DP),wrap_content,或fill_parent,是一个更好的方法,因为它有助于确保您的应用程序将正确显示在各种设备的屏幕大小。公认的测量类型定义在可用资源文档。
Layout Position
一个视图的几何形状是长方形的。一个视图有一个位置,表示为一对左边和顶部坐标和两个维度,表示为一个宽度和一个高度。位置和尺寸的单位是像素。
也可以检索位置的视图通过调用方法getLeft()和getTop()。前者返回左,或X、协调的矩形代表视图。后者返回顶部,或Y坐标的矩形代表视图。这些方法都返回视图的位置相对于它的父。例如,当getLeft()返回20,这意味着视图位于20像素右边的左边缘的直接父类。
此外,提供了几种方便的方法,以避免不必要的计算,即getBottom getRight()和()。这些方法返回正确的坐标和底部边缘的矩形代表视图。例如,调用getRight()类似于以下计算:getLeft()+ getWidth()。
Size,Padding and Margins
一个视图的大小表示与宽度和一个高度。一个视图实际上拥有两双的宽度和高度值。
第一对被称为测量宽度和高度测量。这些维度定义多大的观点想要在它的父。测量的尺寸可以通过调用getMeasuredWidth()和getMeasuredHeight()。
第二对是简单地称为宽度和高度,或有时图宽度和提升高度。这些维度定义的实际大小视图在屏幕上,在绘图时间和之后的布局。这些值可能,但不需要,不同的是,从测量的宽度和高度。宽度和高度可以通过调用getWidth()和()获得。
测量它的尺寸,一个视图考虑其填充。填充像素表达为左,上,右,下部分的视图。填充可以用来抵消视图的内容通过一个特定数量的像素。例如,一个左填充2将推动视图的内容由2像素右边的左边缘。填充可以设置使用setPadding(int,int,int,int)方法调用和查询getPaddingLeft(),(),getPaddingRight getPaddingTop()和getPaddingBottom()。
即使一个视图可以定义一个填充,它不提供任何支持的利润率。但是,视图组提供这样的支持。更多的信息请参考ViewGroup和ViewGroup.MarginLayoutParams。
关于尺寸的更多信息,请参阅尺寸值。
Common Layouts