【网学网提醒】:网学会员,鉴于大家对Beginning_Android_2中午版4十分关注,会员在此为大家搜集整理了“Beginning_Android_2中午版4”一文,供大家参考学习!
kouming366(
网学)贡献
《Android2基础教程》-第4章基于XML的布局
第4章基于XML的布局
从技术角度讲,纯粹通过Java创建并给Activity添加部件是可行的,前一章也是这样做的。但是,更常见的方式则是使用XML格式的布局文件。部件的动态实例化一般只针对较为复杂的情况,即在编译时无法知道部件在哪里的情况(例如,需要基于从因特网取得的数据生成一列单选按钮)。明白这一点之后,接下就该从XML入手,学习如何使用它布局Android活动了。
4.1何谓基于XML的布局
顾名思义,基于XML的布局就是以XML格式对部件之间——以及部件与其容器(第6章讨论容器)之间——的相互关系进行说明。而且,Android将基于XML的布局视为资源,因此布局文件会被保存在Android项目的res/layout文件夹中。每个XML文件中包含着一组树形结构的元素,这些元素指定了构成视图层次的部件及其容器的布局。XML元素的特性(attribute)都是属性(property),用于描述部件的外观或者容器的行为方式。例如,假设Button元素有一个特性值android:textStyle="bold",则意味着按钮上的文本应该以粗体样式呈现。Android的SDK中有一个工具(aapt)会使用布局。这个工具会由Android工具链(例如Eclipse或Ant的build.xml)自动调用。对于作为开发人员的你来说,必须知道aapt负责在项目中生成R.java源文件,以便Java代码能够直接访问该布局中的布局和部件;本章也将就此给出相应例子。
4.2为什么使用基于XML的布局
可以使用XML布局文件实现的任务,大多数情况下也可以通过Java代码实现。例如,不在XML布局中使用属性,而是调用setTypeface()方法也可以让按钮的文本呈现为粗体。考虑到使用XML布局会增加一个需要维护的文件,所以必须搞清楚为什么要使用它们。最主要的一个原因,恐怕就是能够为定义视图的工具提供便利,例如EclipseIDE中的GUIBuilder或专门用于设计AndroidGUI的DroidDraw。通常,这些GUIBuilder可以生成Java代码而不是XML。可是,重新读取UI定义以进行编辑并不是件轻而易举的事;如果相关数据是以
1/4
《Android2基础教程》-第4章基于XML的布局XML这样的结构化格式(而非语言代码形式)保存的,这个过程就要容易得多了。此外,保持生成的XML定义与硬编码的Java代码分离,也可以避免重新生成定义时意外地破坏开发人员自己编写的源文件。使用XML格式在这个
问题上可以取得某种平衡,既为工
具编写者使用提供了方便,也使得开发人员手工编码变得更容易。
此外,XML作为GUI定义的格式也是大势所趋。将微软的XAMLExtensibleApplicationMarkup(
Language,可扩展应用
程序标记语言)、Adobe的Flex和Mozilla的XUL(XMLUserInterfaceLanguage,XML用户界面语言)都采用了与Android类似的手段:将布局信息放在一个XML文件中,将逻辑代码放在源文件中(例如,XUL与JavaScript)还有许多名气不大的GUI框架。(如ZK),也都使用XML来定义视图。虽然跟风不见得最好,但这样起码可以让熟悉其他XML视图描述语言的开发人员更容易掌握Android开发。
4.3那好,举个例子吧
以下是前一章的示例应用
程序中用到的Button,我们在此将它转换成了XML布局文件,可以在Layouts/NowRedux示例项目中找到这个文件:
在这里,部件的类名Button成了XML元素的名字。由于Button是Android提供的部件,因此仅使用类名就可以了。如果要是你自己创建了作为android.view.View子类的部件,那么就需要在此提供完整的包名(例如commonsware.android.MyWidget)。另外,还需要在根元素中声明AndroidXML的命名空间:
xmlns:android=schemas.android/apk/res/android
其余的所有元素都是根元素的子元素,因而都会继承这个命名空间。因为我们需要在Java代码中引用这个按钮,所以还需要通过android:id特性为它指定一个标识符。下一节将详细说明android:id标识符的概念。剩下的特性与相应Button实例的属性是一一对应的。?android:text:表示按钮上初始显示的文本(在这个例子中是空字符串)。?android:layout_width和android:layout_height:告诉Android按钮的宽度和高度与父元素的关系——在这个例子中,按钮会占据整个屏幕。第6章还将详细介绍这些特性。由于我们的Activity中只有这一个部件,因此XML文件中也只需要定义这一个元素。在更复杂的UI中,会有更多元素构成树形结构,用来表示部件以及控制它们位置的容器。本书后面各章都将尽可能使用XML布局格式,因而还会有很多例子供你学习。
2/4
《Android2基础教程》-第4章基于XML的布局
4.4什么时候加@符号
很多部件及其容器只要出现在XML布局文件就行了,不用在Java代码中引用。例如,布局文件中经常要使用静态标签(TextView)来表示它应该显示在哪里。像这种元素在XML中就不需要使用android:id特性为其指定名字。一句话,对于确实需要在Java源代码中引用的元素,就需要为它指定android:id特性。使用“@+id/……”作为id值
是一种约定,其中“……”表示当前小部件在上下文中唯一的名字。在上一节给出的XML布局文件的例子中,Button部件的标识符是@+id/button。Android提供了一些特殊的android:id值,格式为“@android:id/……”。在本书后面你会看到很多这样的例子。
4.5怎样在Java中使用布局文件
在精心设计了部件和容器,将XML布局文件命名为main.xml,然后保存到res/layout文件夹之后,只要在Activity的onCreate()回调中加入一条语句,即可使用该布局:
setContentView(R.layout.main);
这同我们前面调用setContentView(),给它传入一个View的子类(即Button)的实例是一样的。Android(基于我们的布局)构建的View可以通过代码生成的R类来访问。布局中的所有资源都可以通过R.layout加上布局文件的名字来访问;例如,res/layout/main.xml可以通过R.layout.main来访问。要访问在布局文件中指定了标识符的部件,可以使用findViewById()并传入部件的标识符。Android在R类中会以R.id.something(其中something是要找的特定部件)的形式生成相应的标识符。这些部件都是View的子类,与前一章中创建的Button一样。
4.6把故事讲完
在最初的Now项目中,按钮上会显示当前时间,该时间反映了我们按下按钮的时间(如果没有按下按钮,则是活动初次显示的时间)。在下面这个重写过的项目中(NowRedux),大多数逻辑仍然是相同的。只不过,这一次没有在Activity的onCreate()回调方法中创建Button的实例,而是引用XML布局文件中的部件:
packagecommonsware.android.layouts;importimportimportimportimportandroid.app.Activity;android.os.Bundle;android.view.View;android.widget.Button;java.util.Date;
publicclassNowReduxextendsActivity3/4
《Android2基础教程》-第4章基于XML的布局
implementsView.OnClickListener{Buttonbtn;@OverridepublicvoidonCreate(Bundleicicle){super.onCreate(icicle);setContentView(R.layout.main);btn=(Button)findViewById(R.id.button);btn.setOnClickListener(this);updateTime();}publicvoidonClick(Viewview){updateTime();}privatevoidupdateTime(){btn.setText(newDate().toString());}}
第一个区别在设置内容视图的地方,这里没有设置在Java代码中创建的视图,而是将视图设置为对XML布局的引用(setContentView(R.layout.main))。在重新构建这个包含对布局文件(项目中保存在res/layout/文件夹内的main.xml)引用的项目时,也会更新R.java源文件。
另一个区别是需要手工创建Button实例,因此调用了
findViewById()。由于我们将按钮标识为@+id/button,所
以这里在引用按钮时就使用了标识符R.id.button。这样,就获得了Bu
tton的实例,接下来就可以设置回调方法以及设置标签了。这个例子的运行结果与原来的Now是一样的,如图4-1所示。
图4-1NowRedux示例活动
4/4
1