Android API Guides---Layouts

布局定义了视觉结构的用户界面。如活动或应用程序插件的用户界面。

您能够通过两种方式申报的布局:
声明在XML UI元素。 Android提供了相应视图类和子类,如那些部件和布局一个简单的XML词汇表。


实例在执行时的布局元素。

您的应用程序能够通过编程创建视图的ViewGroup和对象(和操纵他们的属性)。
Android框架为您提供了使用这些方法的一种或两种来声明和管理应用程序的用户界面的灵活性。

比如。你能够在XML中声明你的应用程序的默认布局,包含将出如今他们和他们的属性屏幕元素。

然后,您能够在您的应用程序会改动屏幕对象,包含那些在XML中声明的状态加入代码,在执行时。


ADT插件为Eclipse提供的XML的布局预览 - 在XML文件打开时,选择版式选项卡。


你也应该尝试的层次结构查看器工具,用于调试布局 - 它揭示布局属性值,当你调试仿真器或设备与填充/保证金指标,并充分渲染视图画线框图。


该layoutopt工具。您能够高速地分析你的布局和层次结构的低效率或其它问题。
在XML中声明你的UI的优势在于,它使您能够更好的应用程序的演示。从控制其行为的代码分开。

你的UI描写叙述是外部应用程序代码。这意味着你能够改动或调整,而无需改动源码并又一次编译。比如。您能够创建不同的屏幕方向,不同的设备屏幕尺寸,以及不同的语言XML布局。此外,在XML声明的布局能够更easy地可视化你的UI结构,因此更easy调试问题。因此,本文的重点是教你怎样在XML中声明布局。假设你有兴趣在执行时实例化视图对象,指的是一个ViewGroup和View类的引用。
普通情况下,宣告UI元素的XML词汇密切关注的类和方法。当中的元素名称相应的类名和属性名相应方法的结构和命名。

其实。通信往往是那么直接,你能猜出XML属性相应一个类的方法,或者你猜怎么类相应一个给定的XML元素。可是。请注意,并不是全部的词汇是同样的。在某些情况下,也有轻微的命名差异。比如,所述的EditText元件具有()相应EditText.setText文本属性。


提示:了解很多其它关于普通布局对象不同的布局类型。

也有教程对你好查看教程指南中建立各种布局的集合。


编写XML
使用Android的XML词汇,你能够高速设计UI布局和它们所包括的屏幕元素,在您创建的HTML网页以相同的方式 - 用一系列嵌套元素。

每一个布局文件必须包括一个根元素,它必须是一个View或ViewGroup中的对象。一旦你定义的根元素,你能够

加入额外的布局对象或部件作为子元素,逐步建立一个定义你的布局视图层次。比如,以下是一个使用一个垂直的LinearLayout保存一个TextView和一个Button的XML布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_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 /布局/文件夹中,所以它会正确编译。


关于语法的布局XML文件的具体信息布局资源文件里是可用的。


载入XML资源
当您编译应用程序时,每一个XML布局文件被编译成一个View资源。

你应该从你的应用程序代码载入布局资源。在你Activity.onCreate()回调的实现。 R.layout.layout文件名称:通过调用的setContentView(),參考传递到您的布局在资源的形式这样做。比如,假设你的XML布局保存为主要layout.xml,你会载入它为您的活动。像这样:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);
}
在活动中的onCreate()回调方法由Android框架当你的活动启动(见有关生命周期的讨论中。活动文档中)调用。


属性
每一个视图和一个ViewGroup对象支持他们自己的各种XML属性。

一些属性特定于一个View对象(比如。TextView的支持文本大小属性)。但这些属性也由可扩展此类不论什么View对象继承。有些是共同全部视图对象,由于他们从根View类继承(如id属性)。并且,其它属性被觉得是“布局參数”。这是描写叙述View对象的特定布局方向,由对象的父ViewGroup中对象定义的属性。
ID
不论什么查看对象能够具有与它相关联的整数ID,唯一地识别在树中的视角。当应用程序被编译时。这个ID被标记为一个整数,可是ID通常被分配布局XML文件作为字符串中的id属性。

这是一个XML属性通用于全部视图对象(由视图类中定义),你会常常使用它。

语法的一个ID,一个XML标签里面:

android:id="@+id/my_button"
该符号(@)在字符串的开头表明XML解析器解析应该和扩大ID字符串的其余部分,其标识为ID的资源。在加号(+)指这是必须被创建并加入到我们的资源(在R.java文件)的新的资源名。有一些由Android框架提供的其它ID资源。

当引用一个Android资源ID。你不须要加符号。但必须加入Android包命名空间,就像这样:

android:id="@android:id/empty"
有了Android包命名空间,我们如今引用从android.R资源类。而不是本地资源类的ID。


为了创建视图和从应用程序中引用它们,常见的模式是:


在布局文件里定义视图/小部件。并为其分配一个唯一的ID::

<Button android:id="@+id/my_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/my_button_text"/>
然后创建视图对象的实例,并从布局(一般在onCreate()方法)捕获它:

Button myButton = (Button) findViewById(R.id.my_button);
创建的RelativeLayout时定义为ID的视图对象是非常重要的。在一个相对布局。同级次能够定义相对于还有一个兄弟视图,这是由独特的ID引用它们的布局。
一个ID不须要在整个树唯一的。但它应该是您正在搜索的树部分中是唯一的(这往往会对整个树,所以最好是全然独特的可能)。
布局參数
命名布局一些XML布局属性定义觉得适合在其所在的ViewGroup布局參数。


每一个ViewGroup类实现扩展ViewGroup.LayoutParams嵌套类。此子类包括用于定义每一个子视图的大小和位置,以适合视图组属性类型。正如你在图1中看到的。父视图组定义布局參数为每一个子视图(包括子视图组)。


图1.可视化与每一个视图相关布局參数视图层次的。




须要注意的是每一个子类的LayoutParams都有自己用于设置值的语法。

每一个子元素必须定义适合于母公司的LayoutParams。虽然它也能够为自己的孩子定义不同的LayoutParams。




全部的视图组包含宽度和高度(layout_width和layout_height),而且每一个视图要求来定义它们。很多的LayoutParams还包含可选的边距和边界。


你能够精确測量指定的宽度和高度。但你可能不希望常常这样做。很多其它的时候,你会使用这些常量来设置宽度或高度之中的一个:


WRAP_CONTENT告诉您的视图大小本身其内容所需的尺寸。
match_parent(API级别前8名为FILL_PARENT)告诉你的看法变得一样大,它的父视图组将同意。
在普通情况下。不推荐指定使用绝对单位的布局的宽度和高度。比如像素。相反,使用相对測量,如密度无关的像素单元(DP),WRAP_CONTENT或match_parent。是一个更好的方法。由于它有助于确保您的应用程序将跨越多种设备屏幕尺寸的正确显示。

接受的測量类型可用资源文件里定义。


布局位置


的图的几何形状是矩形的。视图具有一个位置,表示为一对左,顶部坐标和两个维度。表示为宽度和高度。

为位置和尺寸的单位是像素。




有可能通过调用方法getLeft()和共达()以检索一个视图的位置。前者返回的左側,或X代表视图的矩形的坐标。

后者将返回前。或Y代表视图的矩形的坐标。

这些方法都返回视图相的位置。它的父。

比如,当getLeft()返回20,这意味着该视图位于20个像素到其直接父的左边缘的右边。


此外,还提供了几个方便的方法。以避免不必要的计算,即GetRight时()和getBottom()。这些方法返回表示视图的矩形的右边缘和下边缘的坐标。

比如,主叫GetRight时()是类似于下面计算:getLeft()+的getWidth()。


大小,填充和利润


一个视图的大小被表示为宽度和高度。视图实际拥有2双宽度和高度的值。


第一对被称为測量宽度和測量高度。这些尺寸定义视图想有多大成为其父项内。所測量的尺寸能够通过调用getMeasuredWidth()和getMeasuredHeight()来获得。




第二对被简单地称为宽度和高度,或有时拉伸宽度和画图高度。这些尺寸限定在屏幕视图的实际尺寸。在拉丝时间及布局之后。这些值能够。但不必,是从所測量的宽度和高度不同。的宽度和高度能够通过调用的getWidth()和getHeight()来获得。




为了測量它的尺寸。以便考虑到它的填充。填充在左,上,右和视图的底部部分像素表示。填充能够用于通过像素的详细数目,以抵消视图的内容。

比如,为2的左填充将由2个像素推视图的内容到左边缘的右边。填充能够使用setPadding(INT,INT,INT。INT)方法调用getPaddingLeft()。getPaddingTop(),getPaddingRight()和getPaddingBottom()来设置和查询。


即使一个视图能够定义填充,它不提供边距不论什么支持。然而,视图组提供这种支持。请參阅ViewGroup中和ViewGroup.MarginLayoutParams进一步的信息。




有关尺寸的具体信息,请參阅尺寸值。


常见的布局


在一个ViewGroup类的每一个子类提供了在它显示你的意见鸟巢的独特方式。以下是一些内置到Android平台比較常见的布局类型。


注意:尽管您能够嵌套还有一个布局中的一个或多个布局,以acheive你的UI设计,你应该努力保持你的布局层次尽可能浅。您的布局绘制速度更快。假设它有较少的嵌套布局(宽视图层次比深视图层次更好)。

Linear Layout


该组织它的孩子到一个单一的水平或垂直行的布局。假设窗体的长度超过屏幕的长度它创建了一个滚动栏。


Relative Layout



使您能够指定子对象的位置相对于彼此(孩子儿童B的左)或父(排列于母公司的顶部)。

Web View


建筑平面布置与适配器


当你的布局内容是动态的还是不预先确定的。您能够使用该子类适配器视图来填充观点在执行时的布局的布局。

该适配器视图类的子类使用适配器将数据绑定到其布局。

适配器的行为作为数据源和所述适配器视图布局适配器之间的中间人检索数据(从源如数组或一个数据库查询),并把每一个条目为能够增加到适配器视图布局的图。


通过适配器支持常见的布局包含:

Grid View


用数据填充适配器视图


能够填充一个AdapterView如ListView的或GridView的由适配器视图实例绑定到一个适配器,它从外部源检索数据,并创建一个视图,表示每一个数据条目。


Android提供适配器几个子类是用于检索不同类型的数据和建设意见的一个AdapterView实用。最常见的两种适配器是:


ArrayAdapter
当您的数据源是一个数组,请使用此适配器。

默认情况下,ArrayAdapter创建调用的toString()上的每一个项目,并把内容放在TextView的每一个数组项的视图。
比如,假设您有想在ListView显示字符串数组。使用构造函数指定每一个字符串,字符串数组布局初始化一个新的ArrayAdapter:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        android.R.layout.simple_list_item_1, myStringArray);
对于这个构造函数的參数是:


您的应用程序上下文
包括该阵列中的每一个串一个TextView布局
字符串数组
然后。仅仅需在您的ListView调用setAdapter():
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);
要自己定义您能够覆盖你的数组中的对象的toString()方法的每一个项目的外观。或者,要为每一个项目视图这是其它东西比一个TextView(比如,假设你想为每一个阵列项目ImageView的)。延长一个ArrayAdapter类并覆盖getView()返回你想为每一个项目的类型来看。


当你的数据来自一个游标使用该适配器。当使用SimpleCursorAdapter,您必须指定一个布局。以用于光标每行。这样在游标中的列应该插入的布局哪些视图。比如,假设你想创建人的名字和电话号码的列表,你能够运行返回一个包括每一个人,列的姓名和号码一排光标查询。然后创建你的布局每一个结果和一个整数数组。指定每一个列应该放在对应的意见想从光标列的字符串数组指定:

String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME,
                        ContactsContract.CommonDataKinds.Phone.NUMBER};
int[] toViews = {R.id.display_name, R.id.phone_number};
当你实例化SimpleCursorAdapter,通过利用每一个结果的布局。包括结果。而这两个数组的指针:

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
        R.layout.person_name_and_number, cursor, fromColumns, toViews, 0);
ListView listView = getListView();
listView.setAdapter(adapter);
该SimpleCursorAdapter然后创建由列项各插入到相应的视图toViews使用提供的布局在游标各行的看法。

假设,你的应用程序的生命过程中,您更改由适配器读取的基本数据,你应该调用notifyDataSetChanged()。这将通知所连接的视图,该数据已被改变,它应该刷新本身。


处理单击事件
您能够通过响应实现AdapterView.OnItemClickListener界面点击一个AdapterView在每一个项目上的事件。 比如:

// Create a message handling object as an anonymous class.
private OnItemClickListener mMessageClickedHandler = new OnItemClickListener() {
    public void onItemClick(AdapterView parent, View v, int position, long id) {
        // Do something in response to the click
    }
};

listView.setOnItemClickListener(mMessageClickedHandler);






posted @ 2017-07-25 10:17  cxchanpin  阅读(334)  评论(0编辑  收藏  举报