1. 声明性设计
设计用户界面的方法有两种,过程性设计和声明性设计。过程性设计是指用代码设计用户界面,例如,开发一个Swing应用程序时必须编写Java代码,以创建和操作所有用户界面对象。声明性设计不涉及任何代码,例如,在设计网页时使用HTML,描述了期望的网页布局,而不是如何实现。
Android同时支持过程性和声明性设计,允许开发人员使用任一风格创建用户界面,即可以绝大部分使用Java代码,也可以绝大部分使用XML描述符。虽然二者都是有效的,但谷歌建议尽可能使用声明性的XML语言,与相应的Java代码相比,XML代码往往更加短小易懂,而且在以后版本中发生变化的可能性不高。
Android程序是一个松散的活动集合,其中的每个活动都定义了一个用户界面屏幕。R.layout.activity_main是一个资源标识符,引用了res/layout目录中的activity_main.xml文件,如下所示:
2. 资源管理
activity_main.xml文件以XML格式声明用户界面,在运行时,Android解析并实例化该文件中已定义的资源,并将其设置为当前活动的视图。R类是由Android Eclipse插件自动管理的,无论将一个文件放到res目录中的哪个位置,Android Eclipse插件都会注意到这一变化并自动在gen目录的R.java文件内添加资源ID,如果删除或修改了某个资源文件,R.java将保持同步,如下所示:
Android资源管理器使用十六进制整数加载实际数据、字符串,以及被编译到软件包中的其他资源。无需关心这些资源的值,只要记住这些值是引用数据的句柄,而不是引用包含数据的对象的句柄。需要使用对象之前不会解压缩对象。
在Eclipse中双击activity_main.xml即可打开该文件,根据Eclipse的具体设置,双击activity_main.xml后出现的可能是可视化的布局编辑器,或是一个XML编辑器。单击底部的activity_main.xml选项卡,查看XML文件,可以看到对<RelativeLayout>的引用,如下所示:
3. 布局
布局是存放一个或多个子对象及某种行为的容器,行为描述了如何将这些子对象放置在屏幕上其父对象的矩形区域中,以下是Android中最常用的几种布局:
1) FrameLayout: 框架布局,从屏幕的左上角开始显示子对象,主要用于选项卡视图和图像切换器。
2) LinearLayout: 线性布局,以单列或单行的形式显示子对象,这是最常用的布局方式。
3) RelativeLayout: 相对布局,相对于其他子对象或父对象的位置显示子对象,这种布局常用于表单中。
4) TableLayout: 表格布局,以多行和多列的方式显示子对象,类似HTML表格。
各种布局方式常用的一些参数如下:
1) xmlns: android="http://schemans.android.com/apk/res/android" 定义Android的XML命名空间,该参数只能在main.xml文件中的第一个XML标签处定义一次。
2) android: layout_width="fill_parent", android:layout_height="fill_parent",声明此布局的高度和宽度与父对象的高度和宽度相同。
如果在编辑器中看到关于缺少语法约束的警告,可以尽管忽略,与将英语文本硬编码到布局文件中不同,可以使用@string/resid这种语法形式引用res/values/strings.xml文件中的字符串。根据区域设置或其他参数的设置情况,还可以有其他资源文件。此外还可以使用一种新的语法形式:@id/resid,与引用在其他地方定义的资源ID不同,这种语法形式将创建一个新的资源ID供其他对象引用。
4. 实现对话窗口
可以在屏幕上创建一个弹出提示窗口,并显示一些与窗口有关的信息,阅读完这些文字后,可以按下按钮关闭窗口。实现这个功能有多种方法:
1) 定义一个新的Activity类并启动它。
2) 使用AlertDialog类并显示它。
3) 子类化Android的Dialog类并显示它。
下面将定义一个新的活动,它也需要一个布局文件,比如将文件命名为res/layout/activity_about.xml,如下所示:
About活动应该在AboutActivity.java文件中定义,只需覆写onCreate()方法并调用setContentView()方法即可,如下所示:
在activity_main.xml中添加一个Button,以便与About活动关联,如下所示:
而后在MainActivity.java中添加一些导入语句,在onCreate()方法中添加代码以调用findViewById()和setOnClickListener()方法,findViewById()方法用于根据资源ID查找Android视图,setOnClickListener()方法则通知Android当用户触摸或单击该视图时应触发哪个对象,如下所示:
要想在Android中启动某个活动,首先需要创建Intent类的实例。Android中有两种Intent,public的Intent是在系统级注册的,可从任何应用程序内使用,private的Intent只能在一个应用程序内使用。此外,每个活动都需要在AndroidManifest.xml文件中声明,运行效果如下:
5. 应用主题和菜单
主题是一个样式集合,可用于覆写Android部件的外观,Android附带了多个主题,可以通过名称进行引用。别外,通过子类化现有主题并覆写其默认值,用户也可以构造自己的主题。可以在res/values/styles.xml文件中自定义主题,要使用主题,首先在编辑器中再次打开AndroidManifest.xml文件,然后修改About活动的定义,如下所示:
样式名称前的@android:前缀表示此处引用了由Android定义的资源,而不是用户自己在程序中定义的资源,再次运行程序,如下所示:
Android支持两类菜单:一种是在用户按下Menu按钮时弹出的菜单,另一种是用户用手指按住屏幕不放时弹出的上下文菜单。以第一种菜单为例,需要使用在res/menu/main.xml文件中定义的菜单,如下所示:
再使用MainActivity类中的onCreateOptionsMenu()方法,如下所示:
getMenuInflater()方法返回一个MenuInflater实例,用于从XML文件中读取菜单定义并将其转换为实际的视图,用户选择任何菜单项时都将会调用onOptionsItemSelected()方法。