声明布局
在一个activity里,你的layout就是整个界面架构。它定义了显示给用户的元素。你可以用两种方式声明你的layout:@ 在XML里定义
android 提供了一些非常直观的视图类及其子类,比如一些widget和layout。
@ 在运行时新建一个实例
你的应用程序可以通过代码建立view或者viewGroup,并且设置它们的属性。
Android框架给了你这两种灵活的方法来管理和声明你的应用程序UI。例如,你可以在xml里声明一个默认的布局,包括用户界面的元素及其属性。你可以在运行时用过代码修改界面元素的包括在xml里声明的。
在xml里定制UI的优点是能让界面与逻辑部分相互独立并且容易iguanli它们的时间。如果UI和代码是分离的,那意味着你可以随时修改界面而不用修改代码后在编译。例如,你可以为横竖屏分别建立布局,不同的界面大小不同的语言。另外,在xml声明布局文件更直观,所以你很容易找出其中的bug,所以,这篇文章会告诉你怎样在xml里声明你的布局。如果你对运行时实例化view和viewGroup感兴趣,那你可以参考这两个ViewGroup和View类。
通常,UI元素的名字和实际的功能非常接近。元素名对应着类名,属性名对应着方法名。实际上,这种对应关系让我们很容易的猜到xml属性所丢应的类方法。或者才出一个类对应着哪个xml元素。然而,不是所有的命名都是相同的。有些情况下,命名会有一些不同。例如,EditText元素有一个text属性,但却对应着EditText.setText()方法。
小贴士:学习更多的布局类型可以参考Common Layout Objects章节,在Hello Views里有大量的创建布局的例子。
编写xml
使用Android xml的词汇表骂你可以很快的设计出UI布局和他们的位置。如同html那样,有一系列的嵌套元素。
每个layout布局文件必须包含一个根元素,这个根元素必须是view 或者 viewGroup。一旦你定义了根元素,你可以添加它的子元素,逐渐形成一个层次的布局。例如,下面是一个LinearLayout包含了一个TextView和Button。
- view plaincopy to clipboardprint?
- <?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声明好layout之后,保存为以xml为后缀名的文件,放到项目的res/layout/目录下,然后他就会被正确的编译。待会我们再来讨论其中的具体元素的含义。
加载xml资源
当你编译完程序后,每个xml都编程一个view资源。你可以从代码中加载这些布局资源,在你的activity。onCreate()方法里。当你调用setContextView()之后,会把资源的引用通过R.layout_file_name的方式传递过去。例如你有了main_layout.xml配置文件,你可以在activity中这样加载:
- view plaincopy to clipboardprint?
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView.(R.layout.main_layout);
- }
当activity运行时,在OnCreate()回调方法会被Android框架所调用。
属性Attributes每个View和Viewgroup对象都支持xml属性,其中一些是特殊的,例如,textView支持textSize属性,但这些属性也可以继承人和view对象来扩展着各类。一些属性是公共的,因为他们继承自根类,例如ID。其他的属性例如layout parameters 为称作布局参数,这些属性用来描述view的布局,被他们的父view,即viewGroup定义的。ID每个View对象都有一个int型Id属性,作为在视图结构中的唯一标识。当一个程序编译完成,id便成为一个int型的引用,但是通常在xml中的id属性中id是一个字符串。这是所有view对象所共有的基本属性,你会经常用到。xml中的书写语法如下:android:id="@+id/my_button"字符串开始的@符,说明xml解析器会解析@符后面剩余的字符串,并会定义他为一个id资源。“+”符号意味着必须在R.java文件中增加这个资源。android框架会提供大量的id资源。当我们引用一个android资源id时,你不需要“+”符号,但是必须添加android包的命名空间,像这样:android:id="@android:id/empty"当使用了android包的命名空间,我们便可以使用android.r资源类了。为了建立view 并且在程序中使用,通常的模式是:1.在xml中定义一个viewm,并且分配一个id
- view plaincopy to clipboardprint?
- <Button android:id="@+id/my_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/my_button_text"/>
2.(通常在onCreate()方法里)在代码中新建一个view对象的引用
- view plaincopy to clipboardprint?
- Button myButton = (Button) findViewById(R.id.my_button);
在RelativeLayout相对布局时,定义view对象的id是非常重要的,这种布局下,兄弟view可以通过之间的位置关系来定布局,就是通过这个唯一标识id。在整个布局结构中,id并不一定是唯一的,保证在当前布局结构中唯一即可,但我们有时会使用到整个布局,所以做好全局唯一。
布局参数
名为layout_something的xml属性定义了在viewGroup里的view的布局参数。每个viewGroup类实现了一个继承自ViewGroup.LayoutParams类的嵌套类。这个子类包含了一些控制他的子View的大小位置等参数。正如下面你所看到的,父View定义了子View的布局:
布局位置 Layout Position
view是一个矩形,每个view都有一个位置,包含x,y起始坐标和宽高来确定这个矩形的位置。位置和尺寸的单位是像素pixel。通过调用getLeft()和getTop()方法可以获得view 的位置,两个方法返回矩形的左上角的坐标xy。这些方法返回的是相对于父view的方位。比如,getLeft()返回20,那么他的右边距离父view左边有20个像素。此外,有很多方便的方法,都是为了减少不必要的计算,像getRight()和 getBottom()。(getRight()=getLeft()+getWidth())
大小、填充、边距 Size, Padding and Margins
一个view的大小即他的宽高。一个view 实际上有两套高度宽度值。第一对值是我们都知道的measured width和measured 高度即测量宽度和测量高度。这组值定义了他们想在父view中有多大,通过 getMeasuredWidth() 和 getMeasuredHeight() 可以获得他们。第二组值为width和height,或者成为 drawing width 和drawing height。这组值定义了view再被绘制到屏幕后,在屏幕中的实际大小。这些值有可能会和第一组值大小不同。通过getWidth()和getHeight()方法可以获得。为了得到view 的实际尺寸,必须考虑到他的填充。padding属性表示view的左上右下的像素间隙。通过设置一些像素值,padding属性被用来填充视图内容周围。例如,把left padding 设置为2,则view左边 与其父view的左边会有2个像素的间隙。通过setPadding(int,int,int,int)方法和getPaddingLeft()\getPaddingRight()\getPaddingTop()\getPaddingBotton()方法设置和获得。尽管一个view可以定义padding,但他不支持margins属性,但是viewGroup支持。参考 ViewGroup和ViewGroup.marginlayoutParams类来获得更多信息。