《Android Dev Guide》系列教程9:用户界面之声明布局

懒骨头(http://blog.csdn.com/iamlazybone)

声明布局

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

<?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中这样加载:

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

<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对象的引用

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的布局:

注意每个布局参数子类有自己的设置值的格式语法,每个子元素必须定义适合父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类来获得更多信息。

懒骨头(http://blog.csdn.com/iamlazybone)

更多相关文章

  1. Android(安卓)自定义View练手Demo(三)实现微信拍一拍的动画效果
  2. Android(安卓)ViewPager的简单使用
  3. Android(安卓)Service详解(一) 初识Service
  4. Android总结之style(样式)和Theme(主题)
  5. Android(安卓)socket高级用法(自定义协议和Protocol Buffer使用)
  6. Android(安卓)最新面试题
  7. 【AndroidManifest.xml详解】Manifest属性之versionCode,version
  8. 一个最简单的Firefox OS APP的开发及部署
  9. Android的布局

随机推荐

  1. 你还在问android横竖屏切换的生命周期?
  2. 【全球首个】Android声纹识别程序 SuperL
  3. android号码匹配位数修改
  4. ok6410开发板android底层驱动模块编写,出
  5. 【Android 开发】:UI控件之 ListView 列表
  6. 【Android】AndroidManifest 清单文件以
  7. 封装view,并在activity中调用(转)
  8. Android ApiDemos示例解析(91):OS->SMS M
  9. Android getText(@string/a)和直接使用字符
  10. Android应用开发提高系列(5)――Android动