`

Android的用户界面简述

阅读更多

在我的理解中,对开发者来说,写J2SE的程序和J2ME的程序相比,最大的区别不是他们API或者是其他一些规则、限制等的不同,更多的是两者程序界面(或者说UI)方面的区别。

我们写任何一段程序,都是需要有UI的,因为我们的程序最终是给用户去用的,即使我们写了一个工具,没有任何显式IO,我们也还是需要暴露必要的方法来提供别人使用,在此情景下,这些方法似乎也可以看作是UI。

对J2SE来说,一般都不会需要GUI,因为我们很少去写SWING、SWT程序,即使Sun力推的JavaFX,好像涉及的也不多,而对于J2ME来说,最大的困难可以就是那些GUI的实现,以及如何将程序的功能绑定到那些界面上,从界面中接收用户的输入,或者是用合适、合理的方式向界面输出,无论是通过文本,或是曲线、图形。

同理,如果你有J2EE的经验,服务后台的代码往往是相对易读、易懂、系统并且内聚的,这些代码看起来是如此的和谐、整洁、干净。而如果涉及到界面,就会陡然复杂的多,即使各种各样的framework试图要解决View与Model、Control的协作问题,结果却让大家更加的迷惑于各种配置之间。总是有GUI的程序都会看起来有些凌乱和繁芜。

似乎有些跑题… 打住…:)。咳咳,同样,对于Android开发来说,用户界面的实现应该是比较重要的和复杂的一环。好消息是,到目前为止,“神仙”们也没有发现其他更好的用户界面实现方式,所以说如果有HTML设计经验,或者说有Swing,Flash等图形设计经验,那么理解Android的UI设计,会容易的多,甚至会有似曾相识的感觉。

Android的用户界面可以有两种实现方式:使用XML或者是使用Java代码。通过直接书写代码的方式来实现界面是比较恐怖的事情。举个例子来说,如果你有DHTML的经验,那么这两者的区别可以比喻为:用XML来实现用户界面就像直接写HTML代码,而用 Java代码来实现用户界面就像用Javascript创建DOM对象来拼接页面。所以,使用XML来布局界面应该是首选。

Android使用一个XML文件来定义用户界面。为了方便理解,你可以直接把它理解为一个HTML文件。事实上,它也确实比较像一个HTML文件。

这个XML文件的格式为:
view plaincopy to clipboardprint?
<ViewGroupClass xmlns:android="http://schemas.android.com/apk/res/android"
id="@+id/string_name" (attributes)>
<widget or other nested ViewGroupClass>+
<requestFocus/>(0 or 1 per layout file, assigned to any element)
</ViewGroupClass>

这里面有一个比较重要的类叫ViewGroup,这个XML的root节点必须是一个ViewGroup,或者是一个单一的Widget(整个XML只有一个元素)。Android几乎所有的UI似乎都和ViewGroup有或多或少的关系。但是它只是一个abstract class,并不能直接使用,我们能用的,是它的一些子类,例如:
AbsoluteLayout
FrameLayout
LinearLayout
RelativeLayout
TableLayout
… 其他还有很多,以后用到的时候再说,一次性把这些东西都弄明白既不客观也不现实。

从上述这几个类从名字就可看的出来,他们是Layout,也就是布局,如果用过Swing的话,这些东西和Swing的那套东西一致,如果没有用过 Swing,希望你用过HTML,那么每一个Layout,可以理解为有了特定排版样式的DIV。在DIV的内部,可以放置其他的DIV,当然也可以放置最底层的元素,比如说文本、文本框、单选按钮、图片等等。这里面所说的最底层的元素,它们有一个超类叫做View,这个超类非常的超,连 ViewGroup都是它的子类。ViewGroup就是能容纳其他View的View。常用的View有很多,可以参考这里,后文再介绍。

关于XML布局,可以总结一下:
这个XML文件是由许多View嵌套组成的
如果布局中有多个元素,那么最顶层必须是ViewGroup(一个ViewGroup对象同时也是一个View对象),不可以是View,如果整个布局只有一个元素,那么最顶层元素就是这个唯一的元素。
在ViewGroup可以内部嵌套View(既然可以嵌套View,就更以嵌套ViewGroup了)
在View中,不可嵌套其他东西了,要不然它就是ViewGroup了,就是这么定义的。

ViewGroup


上面提到的几个ViewGroup,稍微详细点介绍一下:
AbsoluteLayout,绝对定位的布局方式,在它内部嵌套的元素必须指定具体的位置。
FrameLayout,帧布局方式,说帧不太容易理解,可以说成是层布局方式,也就是说,在它内部的元素,是一层一层的叠加在一起的。如果用过Photoshop,或者Flash,这里面的层的概念是和他们一致的。如果最上层的元素是不透明的,并且比下面的元素尺寸要大,那么将看不到下面的元素,只能看到顶层元素。这些层的顺序是:最新声明的放到最前面。可以这样理解,Android按文件的书写顺序来组织这个布局,先声明的放在第一层,再声明的放到第二层,…,最后声明的放在最顶层。
LinearLayout,线性布局方式(真不知道这该怎么翻译,其实很多技术名词还是不翻译的好),这种布局比较常用,也比较简单,就是每个元素占一行,当然也可能声明为横向排放,也就是每个元素占一列。
RelativeLayout,相对定位的布局方式,这个比较好玩,在元素的位置的时候,使用相对位置,可以相对其他元素,也可以相对这个布局,就像我说:我现在站在pawa和 tempest的中间;或者说,我站在队伍的中间。前者就是相对其他元素来定义位置,后者是相对整个布局来定义位置。(注:pawa和tempest是Android历史上很著名的两位人物,具体请参阅 Roiding.com)。
TableLayout,表格的布局方式,我真的不忍心翻译Table这个词,翻译成表格,似乎少了一些神韵,这里面的Table和HTML中的Table非常像,就连写法都非常像。

android:orientation=”vertical”/  ”horizontal” //  竖直 / 水平排列
 android:layout_width=”fill_parent” 声明此布局的宽度为:填满parent,这里面的parent也不好翻译,意思就是,如果它是嵌套在其他ViewGroup之中,那么那个ViewGroup的宽度就是它的宽度,如果它是顶层的元素,那么就填满屏幕
android:layout_height=”wrap_content”wrap_content的意思是:够用即可,那如果说填满整个parent都不够用呢?那就只能显示那么多了,空间不够的只能被隐藏掉了,所以必要的时候得使用ScrollView,后面再说。
每一种元素可以定义属性有很多,并且这些属性都可以和HTML的css中的属性来类比,遇到的时候再叙或者是翻一下相关文档。

Android的R.java,在R.java的注释部分, 有这样一段话:“AUTO-GENERATE FILE. DO NOT MODIFY”,这个文件是自动生成的,不要修改。
1.这个文件就是Java代码和独立于Java代码的资源文件之间的访问窗口,Java程序可以通过R.java来访问那些资源文件。
2.这个文件是在程序编译过程中由aapt(Android Asset Packaging Tool) 自动生成
3.这个文件中的属性都是public static final的,所以可以直接在Java代码中引用,每个属性都代表一个资源,看起来就像为每个资源都定义了一个ID,然后通过这个ID来访问资源
4.所有的资源文件都被编译进最后生成的二进制包中,这样能够带来很高的性能和效率

 

  Activity  两个比较重要的概念是ViewGroup和View。如果套用时髦的MVC来理解的话:ViewGroup和View属于View领域的东西,Activity 可以理解为Control领域的东西,虽然可以这 么类比着来理解,但是Activity其实做了更多的事情,由它将View和一些数据、操作等结合在一起,完成一个相对完整的行为、活动。所以,任何 View要被显示,必须通过Activity来进行。这样每个Activity都会包含特定的行为,多个Activity互相合作,最终组成一个完整的 Android程序。

Button btn = (Button) findViewById(R.id.button_sayhello)这个语句中的findViewById()s是一个比较简单、重要、常用并且是一直用的语句,他的功能就是在当前的ContentView中按ID来找到 对应的View。例如这里,通过R.id.button_sayhello,就能找到第1步提到的Button了。这个用法和javascript中 的:document.getElementById()有异曲同工之妙。
 btn.setOnClickListener(new View.OnClickListener())
在的GUI程序,好像都喜欢事件驱动的模型,有人这样描述过GUI系统本质: 在事件驱动下动态地展现数据模型的图形系统。在这个语句中,setOnClickListener就是为btn添加一个事件监听,监听OnClick事件,也就是说,如果一旦触发btn的OnClick事件,就会执行后面定义的功能。

分享到:
评论

相关推荐

    Android四大组件简述

    Activity是Android应用的用户界面组件,它负责与用户交互。每个Activity都有一个与之关联的布局文件,用于定义屏幕上的视图元素。当用户启动一个应用或者在应用之间切换时,系统会创建或恢复相应的Activity。...

    老罗Android视频开发教程 android常用布局的介绍代码

    在Android应用开发中,布局(Layout)是构建用户界面的核心元素。它们决定了应用程序中的组件如何在屏幕上排列和交互。老罗的Android视频开发教程中详细介绍了几种常用的Android布局,包括线性布局(LinearLayout)...

    Android 启动过程详解

    Android操作系统启动过程是一个复杂且精细的过程,它涉及到从硬件层面的初始化到最终用户界面的呈现。整个启动流程可以大致分为以下几个阶段: 1. **init进程启动** 2. **Native服务启动** 3. **SystemServer与...

    认识Android布局文件

    通过理解和熟练运用布局文件,开发者能够创建出用户友好的、具有吸引力的交互界面。 ### 一、初步认识布局文件 布局文件通常位于项目的`app/res/layout`目录下,以`.xml`为扩展名。例如,`activity_main.xml`就是...

    Android_Package_installer原理简述.doc

    其中,通过SD卡中的APK文件进行的安装会触发Package Installer,它提供用户可见的安装界面。 安装过程大致如下: 1. 将APK文件复制到`data/app`目录。 2. 解压缩APK,读取并解析其内容,包括权限、服务、活动等元...

    android控件的布局介绍及使用(全)

    在Android应用开发中,控件(Widget)是构成用户界面的基本元素,它们负责显示应用的数据并允许用户进行交互。控件布局是决定控件在屏幕上的位置和方式的结构,它影响着应用的用户界面布局和整体设计。本文将详细...

    Android的TextView添加闪烁效果

    在Android开发中,为了增强用户界面的互动性和吸引力,开发者有时会希望在TextView中实现一些特殊效果,例如让文字闪烁。这个任务可以通过自定义View来完成,具体涉及到的知识点包括自定义View、线性渲染以及动画...

    Android本科毕业设计基于Android的天气预报APP系统源码.zip

    界面左边有一列城市列表,显示中国各个城市名称,当用户想知道哪个城市的天气情况时,点击这个城市名就可以获取天气状况,显示城市名称,城市名片,温度和天气情况,同时对未来6天的天气情况简述Android本科毕业设计...

    android的布局文件介绍

    在Android开发中,布局文件是构建用户界面的关键组成部分。它们定义了应用屏幕上的各个组件(View)如何排列和展示。本篇文章将详细讲解Android的几种布局方式,包括线性布局、相对布局、表格布局、网格视图、标签...

    2011主流android应用市场竞品分析报告

    #### 七、用户界面与体验 - **整体UI**:大多数应用市场采用了相似的布局和设计,但细节处理各有千秋。 - **用户体验**:用户体验是决定用户是否选择某个应用市场的重要因素之一。 #### 八、总结 总体来看,2011...

    Android 源码编译过程

    首先,Android源码主要由Java和C/C++代码组成,包括Linux内核、HAL(硬件抽象层)、框架服务、库、用户界面以及应用程序。整个编译过程分为以下几个主要阶段: 1. **环境配置**:在开始编译之前,你需要设置一个...

    Android简介及其开发环境的搭建

    Android开发的关键概念还包括:Activity(应用程序的基本单元,负责用户界面)、Intent(用于启动其他组件或传递数据)、Service(后台运行的服务)、Broadcast Receiver(广播接收器,监听系统广播事件)以及...

    Android Android系统开发编译环境配置

    - `libncurses5-dev`、`zlib1g-dev`:提供文本用户界面和压缩功能的库。 #### 二、下载repo工具 Repo是Google开发的一款版本控制系统客户端,用于管理和同步大量分布式代码仓库。通过执行`curl ...

    android 4大组件.rar

    1. **Activity**: Activity是用户与应用交互的界面,它代表了一个可视化的用户界面。当用户打开一个应用或在应用间切换时,通常就是在与不同的Activity进行交互。Activity可以响应用户的点击事件,执行相应的操作,...

    Android PopupWindow使用示例

    这个组件在许多场景下都非常有用,例如在主界面之上显示附加信息或者提供附加操作。下面将详细介绍`PopupWindow`的使用方法及其相关知识点。 首先,`PopupWindow`的创建需要三个基本元素:一个View(内容视图)、一...

    android 创建服务

    服务在Android系统中扮演着后台持续执行任务的角色,它不同于Activity,因为服务没有用户界面。服务的运行不受用户界面的影响,即使应用被切换到后台或手机屏幕关闭,服务仍可以继续运行。但需要注意的是,Android...

    Android 事件处理机制

    在Android系统中,事件处理机制是用户界面交互的关键部分,它允许应用程序响应用户的输入操作,如点击、滑动等。Android事件处理主要包括两种方式:基于监听器(Listener)的事件处理和基于消息队列(Message Queue...

    基于Android平台的数独游戏毕业论文.doc

    3. (美)Jason Ostrander的《Android UI基础知识教程》,这可能是为了掌握Android用户界面设计的关键概念。 4. (美)Ed Burnette的《Android基础教程:第3版:修订版》,为Android应用开发提供了详细指南。 论文中...

    仿制android QQ说明

    6. **代码简述**:应用的入口类是`MainActivity`,它负责检测用户的登录状态并执行相应的界面跳转。`user()`方法用于获取或检查登录状态,通过`SharedPreferences`来存储和读取登录信息。登录状态的判断基于`...

Global site tag (gtag.js) - Google Analytics