Layouts

来源:互联网 发布:照片换服装软件下载 编辑:程序博客网 时间:2024/05/22 10:31
布局为用户界面定义了可视化结构,比如一个Activity或应用程序的用户界面。你可以使用两种方法来定义一个布局:
在XML中声明UI元素:Android提供了一个简单的XML语言来对应View类和它的子类,比如小部件和布局。
动态实例化布局元素:你的应用可以通过编程方式来创建View和ViewGroup对象。
Android的Framework给你提供了灵活的使用上面两种方式来声明或者管理你应用的UI。例如,你可以声明你应用中的默认的XML布局,包含了将出现在它们的屏幕元素和他们的属性。你然后在你的应用程序中使用代码来动态的修改屏幕对象的状态,包含这些在布局中声明的属性。
在XML中声明你的UI的优势在于它可以让你更好的将你的应用程序从代码中分离出来,并控制他的行为。你的UI描述在你应用程序外部的代码,意味着你可以修改或者适应它,而不需要修改你的源码并重新编译。比如,你可以为不同的屏幕方向,不同的设备尺寸,和不同的语言创建XML布局。此外,在XML文件中声明布局让你的UI结构更加容易可视化,因此更容易debug。至此,这个文档的焦点在于教你怎样声明你的布局文件。如果你对动态实例化View的对象,可以参考ViewGroup和View类。
一般来说,XML中声明UI元素的语法非常相似于这个类中命名和方法结构,元素名称对应于类名和属性名称对应于方法。事实上,这个对应关系进场是这样,所以你可以猜测什么XML属性对应一个类的方法,或者猜测类对应一个给定的XML。然而,注意并不是所有的语法都是完全相同的。在一些例子中,还有一些轻微的不同。例如,EditText元素有一个文本元素与EditText.setText()对应。

Write the XML

使用Android的XML语法,你可以快速设计UI布局和它们包含的屏幕元素,同样的你可以在HTML中创建网页,通过一系列嵌套元素。
每个布局文件必须包含确切的一个根元素,它必须是一个View或者ViewGroup对象。一旦你定义类根元素,你可以添加额外的布局对象或小部件作为子元素来逐步的建造一个定义在你布局中的View层级。例如,这儿有一个XML布局使用垂直显现布局来持有一个TextView和Button:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
             
android:layout_width="match_parent"
             
android:layout_height="match_parent"
             
android:orientation="vertical">
   
<TextViewandroid:id="@+id/text"
             
android:layout_width="wrap_content"
             
android:layout_height="wrap_content"
             
android:text="Hello, I am a TextView"/>
   
<Buttonandroid:id="@+id/button"
           
android:layout_width="wrap_content"
           
android:layout_height="wrap_content"
           
android:text="Hello, I am a Button"/>
</LinearLayout>
后面你可以在xml声明你的布局,以.xml作为后缀保存在你andorid工程的res/layout的目录下。这样它将会正确的编译。

Load the XML Resource

当你编译你的应用程序时,每个XML的布局文件被编译成为一个View资源。你应该从应用程序代码中加载布局资源,是在你的Activity.onCreate()方法中实现。通过调用setContentView来这样处理。引用你布资源的格式:R.layout.layout_file_name.例如,如果你的布局资源被保存为main_layout.xml, 你可以这样加载它:
publicvoid onCreate(Bundle savedInstanceState){
   
super.onCreate(savedInstanceState);
    setContentView
(R.layout.main_layout);
}
当你的Activity被启动后,在你Activity中的onCreate()回调方法会被调用。

Attributes

每个View和ViewGroup对象都支持一系列它们自己的XML属性。一些属性是特定于View的对象(例如:TextView支持textSize属性),但是这些属性同样也被任何可以扩展View的对象继承。对于所有的View对象来说一些属性是共同的,因为它们都继承自View这个基类(比如,id属性)。而且,其他属性被当作布局参数,这是描述View对象的布局方向属性,如对对象的ViewGroup对象定义。

ID
任何View对象可能会有一个与它关联的整数id,来唯一标识在tree中的view。当应用程序被编译后,这个id被关联为一个整数,但是这个id在xml布局中的id属性上被指定为一个字符串。这时所有View对象的共同属性,你会经常用到它。在xml内部标签,id的语法如下:
android:id="@+id/my_button"
这个字符串开头的@符号指示了XML解析器应该解析和扩展这个id字符串的剩余部分并且标识它作为一个id资源。+符号意味着这是一个新的资源名称必须被创建和添加到我们的资源中(在R.java文件中)。这里有许多被framework提供的其他id资源。当引用一个资源id,你不需要+符号,但是必须添加android 包名。比如:
android:id="@android:id/empty"
根据android包名的命名空间,我们现在正在从android.r 资源类中引用一个id,而不是本地的资源类中。
为了创建views并且从应用中引用它,一个共同的模式是这样的:
1.在布局文件中定义一个view/widget并指定以个唯一的id:
<Buttonandroid:id="@+id/my_button"
       
android:layout_width="wrap_content"
       
android:layout_height="wrap_content"
       
android:text="@string/my_button_text"/>
2.然后创建一个view对象的实例并且从布局中捕获它。(通常在onCreate()方法中):
Button myButton =(Button) findViewById(R.id.my_button);
当创建一个相对布局时,为View对象定义id是重要的。在一个相对布局中,兄弟视图可以定义它们的布局相对于另一个兄弟视图,这是引用的唯一的标识。 在整个树上,一个标识不必是唯一的,但它应该是在树的一部分中唯一的搜索 。

Layout Parameters
以layout_something 命名的XML布局属性为View所在的适当的ViewGroup定义了布局参数。
每个ViewGroup类实现了一个嵌套的类,这个类继承了ViewGroup.LayoutParams。这个子类包含了为每个子View定义大小和位置的属性类型,为相关的ViewGroup。如下图所示,父ViewGroup为每个子View定义了布局参数(包括子ViewGroup)。

注意每个LayoutParams子类有自己的语法来设置值。每个子元素必须为它的父View定义LayoutParams,通过它可能也为它的子View定义不同的LayoutParams。
所有的ViewGroup包含了一个宽度和高度(layout_width 和layout_height),每个view被要求定义它们。许多LayoutParams同样包含可选择的margins和borders。
你可以指定宽高精确的测量值,即使你可能不常这样做。更多的情况是,你将使用这些常量值中的一个来设置宽高:
wrap_content 告诉你的view根据它的内容来设置自身的大小
match_parent 告诉你的view变成和ViewGroup允许的一样大。
一般来说,指定一个布局的宽高使用绝对的像素大小是不推荐的。使用相关的测量值,比如dp,wrap_content ,match_parent ,会更好的适配,因为它将确保你的应用程序将在一系列的屏幕尺寸中显示正确。公认的测量类型定义在Available Resources 文档中。

Layout Position

view的几何形状为矩形。view有一个定位,表示为一对left和top的坐标,两个尺寸大小,表示为宽和高。位置和尺寸的单位是像素。
通过调用方法getLeft()和getTop()可能获得view的位置。前者返回代表View矩形区域的left,或者x坐标。
后面的方法返回代表View矩形的top,或者y坐标的值。这些方法都是返回的相对于它父View的位置。例如,当getLeft()返回20,意味着view位于它直接父View的左边的右边距20像素。
另外,也提供了几个方便的方法来避免不必要的计算,getRight()和getBottom().这些方法返回了右边的左边和View矩形区域的底部。例如,调用getRight()等价于getLeft()+getWidth()。

Size, Padding and Margins

view的大小由宽和高表示。一个View实际上拥有两对宽和高度的值。
第一对被称为测量宽度和测量高度。这些尺寸定义了View想要在它的父View中成为的大小。测量尺寸包含了调用getMeasuredWidth() 和 getMeasuredHeight().。
第二对简称为宽度和高度,或者有时称为绘制宽度和绘制高度。这些尺寸定义了在绘制时期和布局之后view在屏幕上的实际尺寸。这些值不同与测量宽度和高度不是必须的。绘制高度和宽度可以通过调用getWidth()和getHeight()获得。
为了测量它的尺寸,View考虑了它的填充。填充用view的左,上,右,下部分来表示。填充能被用来偏移指定像素中View中内容。例如,左边2个像素的填充将使View的内容推向左边缘的右边2个像素。填充能够通过使用setPadding(int,int,int,int)来设置和通过getPaddingLeft(), getPaddingTop(), getPaddingRight() 和getPaddingBottom() 来查询。
即使view能够定义一个填充(padding),它并不支持任何边距(margins)。然而ViewGroup提供这样的支持。参考ViewGroup和ViewGroup.MarginLayoutParams获得更多信息。

Common Layouts

每个ViewGroup的子类提供唯一的方法来显示View的嵌套。下面是andorid平台中一些常见的布局类型。
即使你能够嵌套一个或多个布局在另一个布局中来实现你的UI设计,你应该努力保持你的布局层级尽可能浅的。你的布局绘制得更快,如果它有一个简单的嵌套的话。
LinearLayout,RelativeLayout,WebView.

Building Layouts with an Adapter

当你的布局中内容是动态的或者不是提前决定的,你可以使用AdapterView的子类来填充布局。AdapterView的子类使用一个适配器来绑定数据到它的布局上。适配器作为数据源和AdapterView的布局的中间人,适配器获得数据和转化为每个实体到一个View上,以便可以添加到AdapterView的布局中。由适配器支持的公共布局包括:ListView和GridView。



1 0
原创粉丝点击