布局定义了视觉结构的用户界面,如活动或应用程序插件的用户界面。您可以通过两种方式申报的布局:
声明在XML UI元素。 Android提供了对应视图类和子类,如那些部件和布局一个简单的XML词汇表。
实例在运行时的布局元素。您的应用程序可以通过编程创建视图的ViewGroup和对象(和操纵他们的属性)。
Android框架为您提供了使用这些方法的一种或两种来声明和管理应用程序的用户界面的灵活性。例如,你可以在XML中声明你的应用程序的默认布局,包括将出现在他们和他们的属性屏幕元素。然后,您可以在您的应用程序会修改屏幕对象,包括那些在XML中声明的状态添加代码,在运行时。
ADT插件为Eclipse提供的XML的布局预览 - 在XML文件打开时,选择版式选项卡。
你也应该尝试的层次结构查看器工具,用于调试布局 - 它揭示布局属性值,当你调试仿真器或设备与填充/保证金指标,并充分渲染视图画线框图。
该layoutopt工具,您可以快速地分析你的布局和层次结构的低效率或其他问题。
在XML中声明你的UI的优势在于,它使您能够更好的应用程序的演示,从控制其行为的代码分开。你的UI描述是外部应用程序代码,这意味着你可以修改或调整,而无需修改源代码并重新编译。例如,您可以创建不同的屏幕方向,不同的设备屏幕尺寸,以及不同的语言XML布局。此外,在XML声明的布局可以更容易地可视化你的UI结构,因此更容易调试问题。因此,本文的重点是教你如何在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


建筑平面布置与适配器


当你的布局内容是动态的还是不预先确定的,您可以使用该子类适配器视图来填充观点在运行时的布局的布局。该适配器视图类的子类使用适配器将数据绑定到其布局。适配器的行为作为数据源和所述适配器视图布局适配器之间的中间人检索数据(从源如数组或一个数据库查询),并把每个条目为可以加入到适配器视图布局的图。


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

List 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
当你的数据来自一个游标使用该适配器。当使用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);






更多相关文章

  1. Android中Toast的常用使用方式总结
  2. 第3.1.3节 排布视图
  3. 【Android】ColorPickerDialog 自定义颜色选择器的实现
  4. 如何使用Android(安卓)UI Fragment开发“列表-详情”界面
  5. Android视图控件属性layout_weight的作用
  6. 【凯子哥带你学Android】Andriod性能优化之列表卡顿——以“简书
  7. Android多屏幕适配及自适应解决方案
  8. Android绘图机制(一)——自定义View的基础属性和方法
  9. Android布局方式(FrameLayout)学习

随机推荐

  1. 【android】Cursor记录集游标、ListView
  2. Android:pt 、sp、dp之间的换算
  3. android的文件系统结构及其引导过程的初
  4. Android实现计算器布局(四种布局方式)之Lin
  5. Android高手速成--第三部分 优秀项目
  6. 移植Android3.0 SDK到freescale imx51_bb
  7. Android-屏幕元素层次结构
  8. Android(安卓)Display System Surface Fl
  9. Android(安卓)监听ContentProvider中数据
  10. Android(安卓)ImageView的scaleType属性