Android应用的用户界面编程

2.1 界面编程与视图(View)组件

Android应用的绝大部分UI组件放在android.widget、android.view包及其子包中,所有UI组件都继承了View类。

Android推荐使用XML布局文件来定义用户界面,可以在代码中控制UI界面,也可以XML和代码混合控制UI界面。

ViewGroup是一个抽象类,通常使用它的子类作为容器,ViewGroup控制其子组件的分布依赖于两个内部类: ViewGroup.LayoutParams 和 ViewGroup.MarginLayoutParams

2.2 布局管理器   从ViewGroup派生出来。

LinearLayout   一个挨一个的排列,既可以纵向,也可以横向排列(不换行)

TableLayout   继承了LinearLayout,

FrameLayout  帧布局  可以设置前景图

RelativeLayout  相对布局的代表,子组件的位置是相对兄弟组件、父组件的位置决定的。

GridLayout  网格布局的代表,Android4.0新增的,如果要在更早的版本中使用,需要导入相应的支持库。

AbsoluteLayout  绝对布局,完全由开发人员用坐标控制组件的位置。

2.3 TextView及其子类

TextView  作用是在界面上显示文本,不能编辑。

TextView的众多子类:EditText可以编辑文字、Button、CheckedTextView等。

EditText的子类 ExtractEditText不是UI组件,是EditText的底层服务类,负责提供全屏输入法支持。

Button 可以通过背景色设置图片,可以使用XML文件来定义drawable的内容,这样可以随着交互动作改变外观 android:background="@drawable/button_selector"。

(2.3.4)使用9Patch图片,可以缩放图片的某个部分。

(2.3.5)Button 的子类:  CheckBox(复选框), RadioButton(单选), Switch(开关), ToggleButton(状态开关)

例程 P95: 

// 为RadioGroup组件的OnCheck事件绑定事件监听器

rg.setOnCheckedChangeListener(new OnCheckedChangeListener()
2.3.7 时钟  AnalogClock, DigitalClock, TextClock

2.3.8 计时器 Chronometer (a simple timer)

2.4 ImageView及其子类

ImageView继承自View组件,派生类:ImageButton, QuickContactBadge(把图片与特定联系人关联), ZoomButton

2.5 AdapterView及其子类 

AdapterView是抽象基类,继承了ViewGroup,由它派生的子类 在用法上十分相似。

2.5.1 ListView、GridView、Spinner、Gallery等AdapterView都只是容器,而Adapter负责提供每天“列表项”组件,AdapterView则负责采用合适的方式显示这些列表项。

2.5.2 Adapter只是一个接口,它派生了ListAdapter和SpinnerAdapter两个子接口。

Adapter常用的实现类如下:

ArrayAdapter:通常用于数组或List集合   (源码\02\2.5\ArrayAdapterTest)

SimpleAdapter:不简单,功能强大(源码\02\2.5\SimpleAdapterTest)(P114 创建这个对象需要5个参数)

SimpleCursorAdapter:用于包装Cursor提供的数据。

BaseAdapter:通常用于被扩展。扩展BaseAdapter可以取得对Adapter的最大控制权,每天列表项的组件由开发者来决定,所以可以对各列表项进行最大限度的定制。(源码\02\2.5\BaseAdapterTest)

2.5.3 AutoCompleteTextView自动完成文本框:根据用户的输入提示给用户可选择下拉菜单。(P118)(源码\02\2.5\AutoCompleteTextViewTest  使用了ArrayAdapter)

2.5.4 GridView和ListView有共同的父类AbsListView,GridView也需要Adapter来提供显示的数据。( 源码\02\2.5\GridViewTest 使用了SimpleAdapter)

2.5.5 ExpandableListView是ListView的子类(P123),列表项可以分组。三个常用Adapter:BaseExpandableListAdapter、SimpleExpandableListAdapter、SimpleCursorTreeAdapter。(源码\02\2.5\ExpandableListViewTest  P125)

2.5.6 Spinner是列表选择框(垂直的),即弹出一个菜单供用户选择。Spinner和Gallery都继承了AbsSpinner,AbsSpinner继承了AdapterView,也就是说只要提供了Adapter,Spinner就可以使用。(P126 源码\02\2.5\SpinnerTest)

2.5.7 Gallery 画廊视图,与Spinner的区别在于它是水平的,还有一个区别是Gallery允许用户通过拖动查看列表项。(源码\02\2.5\GallaryTest)。Android已不推荐使用Gallery了,新版本应该用HorizontalScrollView和ViewPager来代替。

2.5.8 AdapterViewFlipper 继承了AdapterViewAnimator,每次只显示一个View组件,可以通过showPrevious()和showNext()方法显示上一个、下一个组件,可以在View切换过程中使用渐隐渐现的动画效果,可以调用startFlipping()自动播放下一个View组件。

2.5.9 StackView 也 继承了AdapterViewAnimator,以堆叠方式来显示多个列表项。

2.6 ProgressBar及其子类

2.6.1 ProgressBar代表了进度条组件,它还派生了2个常用的组件:SeekBar和RatingBar。

在标题上显示进度条 源码\02\2.6\TitleProgressBar

2.6.2 SeekBar 拖动条,允许用户拖动滑块来改变值,比如调节音量等。

2.6.3 RatingBar 星级评分条,与SeekBar的最大区别是用星星来表示进度。

2.7 ViewAnimator及其子类 

ViewAnimator继承了FrameLayout,可以将多个View组件叠在一起,还可以在切换时表现出动画效果。

2.7.1 ViewSwitcher代表了视图切换组件,为了给ViewSwitcher添加多个组件,要调用ViewSwitcher的setFactory方法来设置ViewFactory,由ViewFactory为之创建View即可。(源码\02\2.7\ViewSwitcherTest  被切换的是GridView,用BaseAdapter的方式为它提供Adapter,还有动画效果)

2.7.2 ImageSwitcher 图像切换器,继承了ViewSwitcher。使用需要2个步骤,1提供一个ViewFactory,2切换函数

2.7.3 TextSwitcher 文本切换器,继承了ViewSwitcher。使用与ImageSwitcher相似,但ViewFactory的makeView()必须返回一个TextView组件。 TextSwitcher与TextView相似,区别在于TextSwitcher的效果更炫,可指定文本切换时的动画效果。

2.7.4 ViewFlipper 与AdapterViewFlipper比较相似,都可以控制组件切换的动画效果,区别是:ViewFlipper需要开发者通过AddView()添加多个View,而AdapterViewFlipper则只要传入一个Adapter(由Adapter负责提供多个View)

2.8 各种杂项组件

2.8.1 Toast 提示消息框,它不会获得焦点,提示一段时间会自动消失。

2.8.2 CalendarView 日历视图,可以显示和选择日期,也可以用触摸滚动日历。

2.8.3 DatePicker和TimePicker 日历和时间选择器。

2.8.4 NumberPicker 数值选择器

2.8.5 SearchView 搜索框 让用户在文本框内输入文字,并允许通过监听器监控用户输入,当用户输入完成后提交搜索是,也可以通过监听器执行实际的搜索。

2.8.6 TabHost 选项卡, 与TabHost结合使用的组件有:TabWidget代表选项卡的标签条,TabSpec代表选项卡的一个Tab页面。使用TabHost的一般步骤:Activity应该继承TabActivity;调用TabActivity的getTabHost()方法获取TabHost对象;通过TabHost对象的方法创建、添加选项卡。(源码\02\2.8\TabHostTest)

2.8.7 ScrollView 滚动视图  最多只能包含一个组件,ScrollView的作用就是为该组件添加垂直滚动条。

HorizontalScrollView实现水平滚动条。

2.8.8 Notification 用来在手机状态栏显示通知,代表一种具有全局效果的通知,程序一般通过NotificationManager服务来发送Notification,这个服务是重要的系统服务。 Android3.0增加的Notification.Builder类可以让开发者轻松创建Notification。

(源码\02\2.8\NotificationTest  通知消息启动了另一个Activity)

2.9 对话框

2.9.1 AlertDialog 可以生成各种内容的对话框,对话框有4个区域:图标区、标题区、内容区、按钮区。 (源码\02\2.9\AlertDialogTest  有6种对话框示例)

2.9.2 对话框风格的窗口,这是一种自定义对话框的方式,本质上依然是窗口,只是把窗口的Activity的风格设为对话框风格即可。(源码\02\2.9\DialogTheme 在AndroidManifest.xml中指定窗口以对话框风格显示)

2.9.3 PopupWindow 可以创建类似对话框风格的窗口。

2.9.4 DatePickerDialog、TimePickerDialog  (源码\02\2.9\DateDialogTest)

2.9.5 ProgressDialog 进度对话框 (源码\02\2.9\ProgressDialogTest)

2.10 菜单

2.10.1 选项菜单和子菜单 Android系统的菜单支持主要通过4个接口来体现:Menu接口只是一个父接口,其下2个子接口SubMenu、ContextMenu,还有一个接口MenuItem

2.10.2 使用监听器来监听菜单事件

2.10.3 创建单选菜单项和复选菜单项

2.10.4 设置与菜单项关联的Activity (源码\02\2.10\ActivityMenu)

2.10.5 上下文菜单 ContextMenu

2.10.6 使用XML文件定义菜单

2.10.7 使用PopupMenu创建弹出式菜单

2.11 使用活动条 ActionBar

活动条位于传统标题栏的位置,即屏幕顶部,可显示图标、标题,前面的例程都有显示。

ActionBar提供的功能:显示选项菜单的菜单项、使用程序图标作为返回home主屏或向上的导航操作、提供交互式View作为Action View、提供基于Tab的导航方式用于切换多个Fragment、提供基于下拉的导航方式。

2.11.1 启用ActionBar  Android3.0以上版本默认启用了ActionBar,可以在AndroidManifest.xml中设置关闭,也可以用代码来控制显示或隐藏ActionBar。(getActionBar().hide();)

2.11.2 使用ActionBar显示选项菜单 (源码\02\2.11\ActionItemTest)

2.11.3 启用程序图标导航  (源码\02\2.11\ActionHomeTest)

2.11.4 添加ActionView  ActionBar还可以显示普通的UI组件(源码\02\2.11\ActionViewTest)

2.11.5 使用ActionBar实现Tab导航 (源码\02\2.11\ActionBar_TabNav)

FragMent 是Android3.0增加的重要API,Fragment相当于Activity片段,一个Activity可以组合多个FragMent,这样一个Activity就可以创建多个用户界面,多个Activity可以复用一个FragMent。总之FragMent相当于Activity的模块化区域。FragMent有自己的生命周期,可以接收和处理自己的事件,并允许Activity动态添加、删除FragMent。P201

Android也为3.0以前的平台增加了FragMent支持,只是FragMent要继承android.support.v4.app.FragMent  (源码\02\2.11\ActionBar_TabSwipeNav)(P204)

2.11.6 使用ActionBar实现下拉式导航

疯狂Android讲义 - 学习笔记(二)的更多相关文章

  1. 疯狂Android讲义 - 学习笔记(四)

    Android应用通常有多个Activity,多个Activity组成Activity栈,当前活动的Activity位于栈顶.Activity相当于Java Web开发的Servlet.当Activi ...

  2. 疯狂Android讲义 - 学习笔记(八)

    第10章 Service与BroadcastReceiver 10.1 Service简介 Service组件也是可执行的程序,有自己的生命周期,创建.配置Service与创建.配置Activity的 ...

  3. 疯狂Android讲义 - 学习笔记(七)

    第8章 Android数据存储与IO  Java IO的数据存储可以移植到Android应用开发上来,Android系统还提供了一些专门的IO API. Android系统内置了SQLite数据库,S ...

  4. 疯狂Android讲义 - 学习笔记(六)

    第7章 7.1 使用简单图片 7.1.1 使用Drawable对象 7.1.2 Bitmap和BitmapFactory 7.2 绘图 7.2.1 Android绘图基础:Canvas.Paint等 ...

  5. 疯狂Android讲义 - 学习笔记(五)

    第五章 Android使用统一的Intent对象来封装“启动意图”,不管是启动Activity.Service组件.或者BroadcastReceiver等,提供了一致的编程模型.Intent设计有点 ...

  6. 疯狂Android讲义 - 学习笔记(三)

    Android的事件处理 3.1 Android提供了两套事件处理机制:基于监听的事件处理.基于回调的事件处理. 3.2 基于监听的事件处理 3.2.1 监听的处理模型  主要涉及三类对象:Event ...

  7. 疯狂Android讲义 - 学习笔记(一)

    常用开发工具的用法 android : 启动Android SDK管理器 android --help  查看具体用法 android create avd -n t10 -t 10 -b armea ...

  8. 【疯狂Java讲义学习笔记】【流程控制与数组】

    [学习笔记]1.switch语句后的expression表达式的数据类型只能是byte.short.char.int四个整数类型.String(Java 7后才支持)和枚举类型. 2.数组的长度不可变 ...

  9. 【疯狂Java讲义学习笔记】【数据类型与运算符】

    [学习笔记]1.8bit = 1byte,4byte = 1word.Java中的整型数据有byte(1字节),short(2字节),int(4字节),long(8字节).Java中的浮点数据有flo ...

随机推荐

  1. 实战使用Axure设计App,使用WebStorm开发(5) – 实现页面功能

    系列文章 实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求  实战使用Axure设计App,使用WebStorm开发(2) – 创建 Ionic 项目   实战使 ...

  2. jQuery核心技术-----------------------------------------------------()

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. DDD~我们应该知道的Model,DomainModel和ViewModel

      回到目录 图在前 目前项目中可能出现的三种Model模式,对于我们现在开发的一个项目,我觉得使用DDD的思想来设计模型比较清晰,使用DDD的思想把模型model分成了如下三种: 下面是我微博中的截 ...

  4. MVVM架构~Knockoutjs系列之验证机制的引入

    返回目录 对于Knockoutjs本身来说,没有提供验证模块,不过,有第三方的扩展,就像你为jquery库作extensions一样,这讲中我将介绍一个Knockout插件扩展,knockout.va ...

  5. 01- Shell脚本学习--入门

    简介 Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本. Unix/Linux上常见的Shell脚本解释器有bash.sh.csh.ksh等,习惯上把它们称作一种Shell.我们常说有多少 ...

  6. Atitit 图像金字塔原理与概率 attilax的理解总结qb23

    Atitit 图像金字塔原理与概率 attilax的理解总结qb23 1.1. 高斯金字塔  (  Gaussianpyramid): 拉普拉斯金字塔 (Laplacianpyramid):1 1.2 ...

  7. WPF入门教程系列二——Application介绍

    一.Application介绍 WPF和WinForm 很相似, WPF与WinForm一样有一个 Application对象来进行一些全局的行为和操作,并且每个 Domain (应用程序域)中仅且只 ...

  8. 按要求编写Java应用程序。 (1)创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”

    package java1; public class People { public String name; public int age; public String sex; public S ...

  9. 初了解NodeJS

    发现了NodeJS以后让我有一种很激动的心情,因为它能做我以前一直想写的东西,而如果没有NodeJS我还需要去学习别的语言,但是有了NodeJS以后就可以通过Javascript来写我的程序了,不得不 ...

  10. replicate复制函数

    按指定次数重复字符表达式 REPLICATE ( character_expression, integer_expression) character_expression 字符数据型的字母数字表达 ...