Dev Guide/Framework Topics/User Interface/XML Layouts

声明布局

在一个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。

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

在xml声明好layout之后,保存为以xml为后缀名的文件,放到项目的res/layout/目录下,然后他就会被正确的编译。待会我们再来讨论其中的具体元素的含义。

加载xml资源

当你编译完程序后,每个xml都编程一个view资源。你可以从代码中加载这些布局资源,在你的activity。onCreate()方法里。当你调用setContextView()之后,会把资源的引用通过R.layout_file_name的方式传递过去。例如你有了main_layout.xml配置文件,你可以在activity中这样加载:

  1. view plaincopy to clipboardprint?
  2. public void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.     setContentView.(R.layout.main_layout);  
  5. }  
复制代码

当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
  1. view plaincopy to clipboardprint?
  2. <Button android:id="@+id/my_button"  
  3.         android:layout_width="wrap_content"  
  4.         android:layout_height="wrap_content"  
  5.         android:text="@string/my_button_text"/>  
复制代码

2.(通常在onCreate()方法里)在代码中新建一个view对象的引用

  1. view plaincopy to clipboardprint?
  2. 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的布局: 2.jpg

2011-5-6 19:20:48 上传
下载附件 (41.19 KB)
注意每个布局参数子类有自己的设置值的格式语法,每个子元素必须定义适合父view的布局参数,尽管他为自己的子view也定义了不同的布局参数。所有的viewGroup都包含了宽高属性,而且必须定义它们。很多布局参数也包含了可选的间隙参数和边界参数。你可以用精确的值来定义宽高,尽管你并不希望经常这样做。更多的时候,你会这样来定义:@ wrap_content 只占用所需要的尺寸@ fill_parent 占用父viewGroup可能的最大尺寸。(在API Level 8 里更名为 match_parent)通常, 不建议使用像素值来定义宽高值,我们经常用相对的单位,如与密度无关的像素单元(dp),或者warp_content或者fill_parent来代替,这样能确保你的程序能运行在大量不同尺寸的设备上。公认的测量类型在 Available Respurces 文档里被定义。


布局位置 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类来获得更多信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值