智能的机操作系统经过多盘厮杀,到现在形成了三足鼎立之势:Android、iOS、Windows phone 8三者一统天下。而其他的诸如Symbian S60, UIQ, Windows Mobile, Linux, Brew、 Blackberry……则成为了过眼烟云。 今天,Android更是在市场上有75%的占有率;在国内比例更甚,达到90%之多。 有人说:上一个十年是互联网时代;这个十年就是移动互联时代! 一、手机的发展史 1844年5月24日。莫尔斯的电报机从华盛顿向巴尔的摩发出人类历史的第一份电报"上帝创造了何等奇迹!" 1875年6月2日,贝尔做实验的时候,不小心把硫酸溅到了自己的腿上。他疼得对另一个房间的同事喊到"活,快来帮我啊!"而这句话通过实验中的电话传到了在另一个房间接听电话的活特耳里,成为人类通过电话传送的第一句话。 1831年,英国的法拉第发现了电磁感应现象,麦克斯韦进一步用数学公式阐述了法拉第等人的研究成果,并把电磁感应理论推广到了空间。而60多年后赫兹在实验中证实了电磁波的存在。 电磁波的发现,成为"有线电通信"向"无线电通信"的转折点,也成为整个移动通信的发源点。正如一位科学家说的那样"手机是踩着电报和电话等的肩膀降生的,没有前人的努力,无线通信无从谈起。" 1973年4月的一天,一名男子站在纽约的街头,掏出一个约有两块砖头大的无线电话,并开始通话。这个人就是手机的发明者马丁库泊。当时他还是摩托罗拉公司的工程技术人员。这是当时世界上第一部移动电话。 1975年,美国联邦通信委员会(FCC)确定了陆地移动电话通信和大容量蜂窝移动电话的频谱。为移动电话投入商用做好了准备。 1979年,日本开放了世界上第一个蜂窝移动电话网。 1982年欧洲成立了GSM(移动通信特别组) 1985年,第一台现代意义上的可以商用的移动电话诞生。它是将电源和天线放置在一个例子里,重量达3公斤。与现代形状接近的手机,则诞生于1987年。其重量仍有大约750克,与今天仅重60克的手机相比,象一块大砖头。此后,手机的"瘦身"越来越迅速。1991年,手机重量为250克左右。1996年秋出现了体积为100立方厘米,重量为100克的手机。此后又进一步小型化,轻型化,到1999年就轻到了60克以下。 二、智能手机发展史 世界上第一部智能手机是摩托罗拉在2000年生产的名为天拓A6188的手机。 该手机是全球第一部智能手机,也是第一部具有触摸屏的PDA手机,它同时还是第一部中文手写识别输入的手机,但最重要的是A6188采用了摩托罗拉公司自主研发的龙珠(Dragon ball EZ)16MHz CPU,支持WAP1.1无线上网,采用了PPSM (Personal Portable Systems Manager)操作系统。龙珠(Dragon ball EZ)16MHz CPU也成为了第一款在智能手机上运用的处理器,虽然只有16MHz,但它为以后的智能手机处理器奠定了基础,有着里程碑的意义。 三、认识Android Android最早由安迪•罗宾(Andy Rubin)创办,于2007年被Google公司收购,Google公司凭借Android操作系统在智能手机上取得了巨大的成功。 如果以前你对智能机了解不多也没有关系,你能感觉到现在的手机除了能够打电话、发短信之外,越来越像一台功能强大的小电脑就OK了! 四、修炼之道 1、不论章法,实现就好 对于我们菜鸟级别,初学的时候很多朋友听了网上传言的“学编程要六级以上英语,高等数学更是要过硬”以致于很多朋友只能“高山仰止”!而实际上初学者经验不足,初入此道,程序可能存在种种错误和BUG,但是这都不能影响我们学习的决心和勇气,就像学开车,即使你从驾校出来有了驾照,刚上路仍然感觉手忙脚乱,眼睛不够用一样,随着你的车技娴熟,你会变得从容起来,编程一样。 不要怕错,学编程比开车要好得多,无论如何你都不会“闯车祸”,大不了重来,怕什么,谁不是从1、2、3开始学起的! 2、规范有序 有了一定的经验就不能像初始阶段,程序逐渐开始规范,无论变量的命名还是各种文档,并且注重程序的运行效率等等。我们都讲:细节决定成败,但往往是“严于律人,宽以待己”,这样不好!细节不是喊一声就会出现在你面前的,这是一个需要不断学习和实践。这个过程有长有短,要看个人的学习能力,领悟能力。 做到内外兼修,内,指的是需求把握,设计思想,设计模式等。外,指的是写代码时的规范,做界面时的严谨等。 3、用户体验 因为我们设计的程序最终是给用户用的,要注意用户体验。 人性化则显得至关重要。 4、学无止境 入门也许是容易的,但是想达到大师级别真不是一件容易的事。 冰冻三尺,非一日之寒。 良好的开端,等于成功了一半。工欲善其事,必先利其器。 如何搭建Android的开发环境?让我们今天一探究竟! 一、准备工作 我们开发Android手机App程序需要准备两样宝贝:Java JDK、Android SDK(ADT即Android Develop Tools缩写)。 1、Java JDK 如果你电脑上没有安装Java环境或者你想使用最新版本,请从下面地址下载最新版本: 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html (1)第一步、单击下图中的①的DOWNLOAD,即Java Platform(JDK)7u9
(2)第二步、单选Accept License Agreement,然后选择Windows x86下载。 (注:windowsX86代表32位操作系统;windowsX64代表64位操作系统。如果你不知道你的操作系统是?位,很简单,选择桌面“计算机”单击右键,查看属性一看就明白了!) 2、Android SDK Android SDK为我们提供了API链接库以及用于建立、测试与调试android应用的开发工具的集合。 下载地址:http://developer.android.com/sdk/index.html 二、软件安装 如果你的网速不够快,那么就请你倒杯茶,边下载边看以下安装步骤。 1、第一步,安装jdk 7u9(jdk-7u9-windows-i586.exe) 双击jdk-7u9-windows-i586.exe安装,单击下一步下一步,直到完成即可,无需配置环境变量。 2、第二步,安装SDK和Eclipse IDE(adt-bundle-windows-x86.zip) (1)解压adt-bundle-windows-x86.zip文件至合适的位置,会生成adt-bundle-windows-x86文件夹,在adt-bundle-windows-x86文件夹又有两个子文件夹:eclipse和sdk。 (2)打开adt-bundle-windows-x86 /eclipse文件夹,然后启动eclipse.exe程序。 当然你也可以把eclipse.exe程序发送到桌面建立一个快捷方式。 至此,我们环境已经全部安装好了,就这么简单!Eclipse IDE集成开发已经帮我们准备好了开发环境,而且SDK也已经自动准备就绪,万事俱备!就等着你开始开发第一个Android App了! 注:不要从adt-bundle-windows-x86文件夹中移走任何文件,否则你将要进行手动配置环境或者以后的升级。 最为经典的“Hello,world!”之Android App应用程序即将在你自己的手机上运行,你是不是心潮澎湃呢?稍安勿躁,你马上就可以实现! 附: 网上比较流行的Android的开发环境常常为JDK+Eclipse+SDK三大利器进行配置,如果你喜欢,你可以百度一下!而Google现在非常推荐你采用本文的方式,尤其你如果是一名新手! 我一直犹豫如何讲解这个开篇之作,但发现的IDE开发环境做得越来越智能,基本上一路回车就可以搞定一个简单的应用。 一、第一步,启动Eclipse 单击桌面Eclipse快捷方式,启动Eclipse IDE开发环境。 二、第二步,建立Android项目 选择菜单file->new->android application project 1、选择workspace(Select a workspace) Eclipse第一次建立Android Project会让你选择workspace(workspace通俗地讲就是把你的项目存到哪个文件夹内),在本案例中我存放到D:\Apps,如果勾选了复选框,下一次建立Android Project就不会再出同这个对话框了。 2、新建Android应用程序(New Android Application) 我们在窗口中输入: Application Name:Hello Project Name:默认会自动与应用程序名称一样,你也可以起不同的名字。 Package Name:com.genwoxue.hello(你可以使用别的包名,习惯用这个域名倒写的方式) Target SDK:如果你采用真机测试,看看你的真机所支持的Android版本。 Compile With:编译可以选择最新版本。 然后单击“Next>”按钮,进入下一步。 3、配置Project(Configure Project) 采用默认设置就可以了。 然后单击“Next>”按钮,进入下一步。 4、配置应用图标Icon(Configure Launcher Icon) 然后单击“Next>”按钮,进入下一步。 5、新建空白Activity(New Blank Activity) 然后单击“Finish”按钮,打开项目主界面。 6、Hello项目主界面 你可能一下子被整个界面弄晕了,太复杂了,这么多文件夹,实际上将来我们所有关心的东西并不多,别害怕,我们只要知道①②③都是干什么的就够了。 其中①表示项目文件管理区;②表示控件区;③表示界面预览区。 三、第三步,建立虚拟设备 如果你还没有一台运行Android的设备(手机),那么我们需要建立一个虚拟设备。 当然你最好有一台真正能够运行Android的设备,你也可以跳过这一步。 1、选择菜单window->Android Virtual Device Manager 2、打开Android虚拟设备管理器(Android Virtual Device Manager) 单击“New…”按钮。 3、新建Android虚拟设备(Create Android Virtual Device) 我们在窗口输入: AVD Name:HTC(你可以高兴输入别的任何名称) Device:选择一款合适的屏(包括尺寸与分辨率) 然后单击“OK”按钮。 4、虚拟设备管理器(Android Virtual Device Manager)就多出来了一款“HTC”设备。 四、第四步,运行程序 1、选择菜单Run->Run(Ctrl+F11) 2、选择Android Device设备 我们有两种选择:使用真机或者虚拟设备。(在本案例中采用华为9200真机。) 3、运行结果 至此,我们第一个Android App正式诞生了,举杯庆贺一下吧!你也正式进入移动开发的行列,未来的十年“移动互联”有你! 当然,我们仅仅是一个开始! 尽管经典之中的经典Hello,world!已经悄然运行在我们的手机上了,但如果现在让你告诉别人你会Android开发,估计你自己都心虚,让我们一起再会Hello,world!项目,揭开庐山真面目。 第一次在Eclipse中看Android项目工作区估计眼都花了,头都晕了,你一定会想:这么复杂! 但事实上,可能会比你想得简单,而且我们采取循序渐进方式,你很快就会掌握的。 一、Android项目工作区概览 新建一个Android项目,Eclipse会自动帮我们建立诸多文件,我们看一下: 其中: 第①部分:表示Java源程序; 第②部分:代表系统资源ID,类似于C语言的*.h文件,请千万不要手工修改R.java文件; 第③部分:Android4.2表示当前SDK是4.2,是目前最新版本; 第④部分:表示资源文件,其中layout布局你可以认为就是界面; 第⑤部分:每一个Android项目都包含一个清单(Manifest)文件--AndroidManifest.xml,它存储在项目层次中的最底层。清单可以定义应用程序及其组件的结构和元数据。 如果你想了解更多AndroidManifest.xml,请单击了解更多>> Android项目中主要文件及文件夹的作用: (1)src:存放所有的*.java源程序。 (2)gen:为ADT插件自动生成的代码文件保存路径,其中的R.java文件将保存所有的资源ID。 (3)Android 4.2:表示现在使用的Android SDK的版本是4.2。 (4)assets:可以存放项目中一些较大的资源文件,如图片、音乐、字体等。 (5)res:可以存放项目中所有的资源文件,如图片(*.png、*.jpg)、网页(*.html)、文本等。 (6)res\drawable-hdpi:保存高分辨率图片资源。 (7)res\drawable-ldpi:保存低分辨率图片资源。 (8)res\drawable-mdpi:保存中等分辨率图片资源。 (9)res\layout:存放所有布局文件,主要是用于排列不同的显示组件,在Android程序要读取此配置。 (10)res\values:存放一些资源文件信息,用于读取文本资源,在文件夹中有一些约定的文件名称。(具体内容待以后详解) (11)res\raw:自定义的一些原生文件所在目录,如音乐、视频等文件格式。 (12)res\xml:用户自定义的XML文件,所有的文件在程序运行时编译到应用程序中。 (13)res\anim:用于定义动画对象。 (14)activity_main:配置所有的控件。 (15)R.java:此文件为自动生成并自动维护的,用户添加的控件会自动在此文件中生成一个唯一的ID,以供程序使用。 (16)AndroidManifest.xml:主要配置文件,用于配置各个组件或一些访问权限等。 总之,看着真的够复杂,你先有个印象就可以了。至少,你应该知道源文件是放在src文件夹;布局文件在res/layout文件夹,其他以后了解也ok。 二、Android项目分析 1、布局文件(res\layout\activity_main.xml) 双击“res\layout\activity_main.xml”打开布局文件。注意①代表布局文件图形界面;②代表布局文件代码界面。 Android App应用程序类似于.net的Winform程序,其中①和②相当于标题栏,①为标题栏的图标,②为标题;③代表标签,类似于众多程序的Label。 我们再来看一下代码: TextCopy to clipboardPrint 1. 2. 3. xmlns:tools="http://schemas.android.com/tools" 4. android:layout_width="match_parent" 5. android:layout_height="match_parent" 6. tools:context=".MainActivity" > 7. 8. android:layout_width="wrap_content" 9. android:layout_height="wrap_content" 10. android:layout_centerHorizontal="true" 11. android:layout_centerVertical="true" 12. android:text="@string/hello_world" /> 13. 希望你在探讨本段代码之前,至少至少要有XML文件的概念,如果没有请了解这后再来继续学习。 本段代码包含了两个重要标签:和,代表线性布局管理器;代表标签组件。其它的皆为两个标签的属性。 我们着重来看一下:android:text="@string/hello_world",我们的运行结果是“Hello world!”而不是“hello_world”! Why? 2、strings文本资源文件(res\values\strings.xml) 双击“res\values\strings.xml”打开文本资源文件。与布局文件一样:①代表文本资源图形界面;②代表文本资源代码界面。 我们打开文本资源strings.xml文件之后,当我们看到: Hello world! 前面的疑虑应该顿消,原来如此啊!hello_world是文本资源文件中的一个标签而已,其真正的内容是“Hello world!”。 你可以通过图形界面或者字符界面添加一个字符串资源,究竟你选择哪种,随你高兴! 3、R.java文件(gen/com.genwoxue.hello/R.java) 双击“gen/com.genwoxue.hello/R.java”打开资源ID文件。 R.java资源文件保存所有资源的ID,譬如前面所讲的hello_world,在这里就是一个整数0x7f040001而已。 如果你感觉这个文件很奇怪也很正常,除非你曾经学习或者写过C for windows应用程序就早已习以为常了。 这个文件你最好只是看看,不要动它!!! 4、AndroidManifest.xml文件 双击“AndroidManifest.xml”项目配置文件。 所有的Activity程序都在AndroidManifest.xml文件中进行注册,故该文件是整个Android项目的核心配置文件。 在节点中配置的android:icon="@drawable/ic_launcher",表示引用drawable(drawable-hdpi、drawable-ldpi、drawable-mdpi三个文件夹中导入)资源配置的图标,引入图标的名称为ic_launcher。现在你可以更换应用程序图标了,你知道了它在哪! 在节点中配置的android:label="@string/app_name",表示此应用程序的标签名称从strings.xml文件中读取,内容为app_name对应的内容。现在你也可以更换应用程序标题了,你知道了它在哪! 当然,你还可以更改Activity的标题,什么是Activity? Activity就是一个活动的窗体,一个项目应用程序可以包含多个Activity。 5、MainActivity.java(src/com.genwoxue.hello/MainActivity.java) 双击“src/com.genwoxue.hello/MainActivity.java”程序文件。 本程序是Android整个项目的主程序,Activity是项目的基本组成部分。 MainActivity继承Activity类,onCreate()方法是启动Activity地默认调用的方法。 super.onCreate(savedInstanceState):调用父类的onCreate()方法; setContentView(R.layout.activity_main):调用布局文件。 我相信你的Android手机上一定安装了不少Android应用,那么如果把我们的Android程序发布为Android应用,以便让别人使用呢? 1、选择File—>Export命令,在打开的界面中选择Android—>Export Android Application文件。 单击“Next>”按钮,选择要导出的项目。 2、可以通过“Browse...”按钮选择Hello这个项目,如果项目处于打开状态,会默认当前项目。 单击“Next>”按钮,进入创建证书界面。 3、导出项目,必须要有证书,我们可以选择已经存在的证书或者创建证书,我们选择“Create new keystore”。 在此,我们输入: Location:D:\Hello(我们可以起一个不同于项目的名称) Password和Confirm:123456 则在D盘根目录下创建了Hello证书。单击“next>”按钮,进入证书完整界面。 4、填写完整的证书信息。 ①部分为证书别名与有效年限; ②部分为开发者相关信息。 单击“Next>”按钮,进入导出Android Application界面。 5、导出项目(Export Android Application) 输入D:\Hello.apk,发布到D盘根目录。 你也可以保存到别的文件夹,但注意该文件夹一定要存在。 单击“Finish”按钮完成整个项目发布过程。 现在,你可以采取你喜欢的任意方式(可以通过数据线、蓝牙)或者发布到Android应用商店供别人下载使用。 第1章、 编辑框EditText与按钮Button 在一个应用中,登录是经常使用的,下面我们学习一下如何开发一个登录窗口。我们需要学习Android中的基本控件:(1)EditText编辑框、(2)Button按钮。 一、设计登录窗口 打开“res/layout/activity_main.xml”文件。 1、分别从工具栏向activity拖出2个EditText(来自Text Fields)、1个按钮(来自Form Widgets)。 2、打开activity_main.xml文件。 代码自动生成如下:注意①和②虽同为EditText,但②要输入密码,故android:inputType="textPassword“。 3、我们把以上代码修改成如下代码,具体为:editText1变为userName;eidtText2变为passWord;buttion1变为login。登录按钮的文本:android:text="Button"变为"登录"。 4、界面如下: 现在运行程序,已经在手机上看起来很像一个登录窗口了。但是,我们单击“登录”按钮,却没有什么反应。我们下面学习如何在“登录”按钮上添加单击事件。 二、单击事件 打开“src/com.genwoxue.edittextbutton/MainActivity.java”文件。 然后输入以下代码: 在以上代码中,我们着重分析一下带有浅蓝色背景部分,其它是最简单的基础代码,如果不明白,请参考上一章内容。 1、第①部分 导入5个包。 2、第②部分 声明三个控件变量。 3、第③部分 这一部分findViewById()方法是一个关键,这个方法表示从R.java文件中找到一个View(注意:我们可以把控件和Acitivity都当成一个View)。例如,tvUserName=(EditText)super.findViewById(R.id.userName)表示我们从R文件中找到userName代表的控件最后返给tvUserName,下一步我们可以通过tvUserName.getText()方法进一步获取到它的值。 另一个关键是就是给“登录”按钮添加单击监听事件:btnLogin.setOnClickListener(new LoginOnClickListener())。 4、第④部分 我们新建一个类LoginOnClickListener继承接口OnClickListener用以实现单击事件监听。 Toast.makeText(getApplicationContext(), info,Toast.LENGTH_SHORT).show()用以提示输入的用户名和密码。 效果如下: 第2章、 单选按钮RadioGroup与复选框CheckBox 在Android App应用中,单选按钮和复选框也是经常使用的,下面我们一起学习一下。我们需要学习Android中的基本控件:(1)单选按钮RadioGroup、(2)复选框CheckBox。 一、设计登录窗口 打开“res/layout/activity_main.xml”文件。 1、分别从工具栏向activity拖出1个单选按钮列表RadioGroup(注意自动包含3个单选按钮RadioButton)、2个复选框CheckBox、1个按钮Button。这3个控件均来自Form Widgets。 2、打开activity_main.xml文件。 我们把自动生成的代码修改成如下代码,具体为: (1)RatioGroup的id修改为gender,两个RadioButton的id分别修改为male和female,其文本分别修改为男和女; 注意:第1个单选按钮android:checked="true"表示此单选按钮默认为选择。 (2)两个CheckBox的id修改为football和basketball,其文本分别修改为足球和蓝球; (3)Buttion的id修改为save,其文本修改为"保存"。 3、界面如下: 这个界面常用于注册,我们可以在控件前加“性别”、“爱好”提示,也可以把整个布局排得更美观一些,但不是现在,在以后我们学过布局章节再说,我们现在把最重要的精力放在控件的使用上。相信不久的将来,你会把页面做得更漂亮! 二、单击事件 打开“src/com.genwoxue.RadioGroupCheckBox/MainActivity.java”文件。 然后输入以下代码: 在以上代码中,我们着重分析一下带有浅蓝色背景部分,其它是最简单的基础代码,如果不明白,请参考上一章内容。 1、第①部分 导入与RadioButton、CheckBox相关的2个包。 2、第②部分 声明5个控件变量。 3、第③部分 与上一章类同。 (1)findViewById()方法完成5个控件的捕获。 (2)“保存”按钮添加单击监听事件:btnSave.setOnClickListener(new SaveOnClickListener())。 4、第④部分 我们新建一个类SaveOnClickListener继承接口OnClickListener用以实现单击事件监听。 Toast.makeText(getApplicationContext(), sInfo,Toast.LENGTH_SHORT).show()用以显示提示信息:性别与爱好。 注意:isChecked()方法用来判断RadioButton和CheckBox控件是否被选中,如果选中返回true,否则返回flase。 效果如下: 第3章、 下拉列表框Spinner 在Android App应用中,下拉列表框Spinner的使用频次是相当高的,如果你对Spinner陌生,你一定不会对HTML中的SELECT陌生,他们的作用是一样的,都是多选一。我们需要学习Android中的基本控件下拉列表框Spinner。 一、设计登录窗口 打开“res/layout/activity_main.xml”文件。 1、分别从工具栏向activity拖出1个下拉列表框Spinner、1个按钮Button。这2个控件均来自Form Widgets。 2、新建province.xml件。 在“res/values”位置新建province.xml文件。 (1)province.xml文件位置如下图所示: (2)province.xml内容如下: 3、打开activity_main.xml文件。 我们把自动生成的代码修改成如下代码,具体为: (1)Spinner的id修改为province; 注意:android:entries="@array/provarray",表示Spinner的Items使用的是province.xml中provarray的值。 (2)Buttion的id修改为save,其文本修改为"保存"。 4、界面如下: 二、单击事件 打开“src/com.genwoxue.spinnerapp/MainActivity.java”文件。 然后输入以下代码: 在以上代码中,我们着重分析一下带有浅蓝色背景部分。 1、第①部分 导入与Spinner相关的包。 2、第②部分 声明2个控件变量。 3、第③部分 (1)findViewById()方法完成2个控件的捕获。 (2)“保存”按钮添加单击监听事件:btnSave.setOnClickListener(new SaveOnClickListener())。 4、第④部分 (1)我们新建一个类SaveOnClickListener继承接口OnClickListener用以实现单击事件监听。 (2)Spinner.getSelectedItem()获取当前选择项的值。 (3)Toast.makeText(getApplicationContext(), sInfo,Toast.LENGTH_SHORT).show()用以显示选择项的提示信息:例如山东省。 效果如下: 第4章、 图像按钮ImageButton 在Android App应用中,默认的Button按钮尽管我们可以通过样式变成圆角,但有时感觉仍然不够美观,我们可以通过采用图像按钮ImageButton改善这种现状,今天我们就一起学习一下图像按钮的使用。 知识点:图像按钮ImageButton 一、设计界面 1、首先把button.png图片复制到res/drawable-hdpi文件夹内。 2、打开“res/layout/activity_main.xml”文件,生成ImageButton按钮。 (1)从工具栏向activity拖出1个图像按钮ImageButton。该控件来自Image&Media。 (2)弹出资源选择器Resource Chooser窗口。 选择download,然后单击OK按钮。 (3)生成的“Download”图片按钮如下: 注意:按钮外边有一圈灰色的边框,我们可以通过android:padding="0dp"去掉边框。 3、打开activity_main.xml文件。 我们把自动生成的代码修改成如下代码,具体为: (1)ImageButton的id修改为download; (2)设置android:padding="0dp",按钮灰色边框去掉。 4、界面如下: 二、单击事件 打开“src/com.genwoxue.ImageButton/MainActivity.java”文件。 然后输入以下代码: 在以上代码中,我们着重分析一下带有浅蓝色背景部分。 1、第①部分 导入与ImageButton相关的包。 2、第②部分 声明ImageButton控件变量。 3、第③部分 (1)findViewById()方法完成ImageButton控件的捕获。 (2)“Download”按钮添加单击监听事件:ibtnDownload.setOnClickListener(new DownloadOnClickListener())。 4、第④部分 (1)我们新建一个类DownloadOnClickListener继承接口OnClickListener用以实现单击事件监听。 (2)Toast.makeText(getApplicationContext(), "图像按钮应用",Toast.LENGTH_SHORT).show()表示单击图像按钮的提示信息。 效果如下: 第5章、 图像ImageView 在Android App应用中,图像是必不可少的。我们可以通过图像ImageView来展示。 知识点:图像ImageView 一、设计界面 1、首先把a.jpg、b.jpg、c.jpg、d.jpg、e.jpg、prov.png、next.png图片复制到res/drawable-hdpi文件夹内。 2、打开“res/layout/activity_main.xml”文件,生成ImageButton按钮。 (1)从工具栏向activity拖出1个图像ImageView、2个图像按钮ImageButton。该控件来自Image&Media。 3、打开activity_main.xml文件。 我们把自动生成的代码修改成如下代码,具体为: (1)ImageView的id修改为picture; (2)“上一幅”按钮ImageButton的id修改为prov; (3)设置android:padding="0dp",按钮灰色边框去掉。 (4)“下一幅”按钮ImageButton的id修改为next; (5)设置android:padding="0dp",按钮灰色边框去掉。 4、界面如下: 二、单击事件 打开“src/com.genwoxue.ImageView/MainActivity.java”文件。 然后输入以下代码: 在以上代码中,我们着重分析一下带有浅蓝色背景部分。 1、第①部分 导入与ImageView、ImageButton相关的包。 2、第②部分 声明ImageView、ImageButton控件变量。 3、第③部分 声明整型数组iImages用于存储图片资源。 4、第④部分 (1)findViewById()方法完成ImageView、ImageButton控件的捕获。 (2)“上一幅”、“下一幅”按钮添加单击监听事件:ibtnProv.setOnClickListener(new ProvOnClickListener())、ibtnNext.setOnClickListener(new NextOnClickListener())。 5、第⑤部分 (1)我们新建一个类ProvOnClickListener继承接口OnClickListener用以实现单击事件监听。 (2)单击按钮能够显示上一幅图片,如果到头了,则重置到最后一幅。 6、第⑥部分 (1)我们新建一个类NextOnClickListener继承接口OnClickListener用以实现单击事件监听。 (2)单击按钮能够显示下一幅图片,如果到头了,则重置到第一幅。 效果如下: 第6章、 日期DatePicker与时间TimePicker控件 在Android App应用中,设置日期和时间时间也是经常遇见的,下面我们一起学习一下。 我们需要学习Android中的基本控件:(1)日期选择控件DatePicker (2)时间选择控件TimePicker。 一、设计登录窗口 打开“res/layout/activity_main.xml”文件。 1、分别从工具栏向activity拖出1个日期选择控件DatePicker、 1个时间选择控件TimePicker、1个按钮Button。控件来自Time&Date、Form Widgets。 2、打开activity_main.xml文件。 我们把自动生成的代码修改成如下代码,具体为: (1)DatePicker的id修改为tody。 (2)TimePicker的id修改为now; (3)Button的id修改为save,其文本修改为"保存"。 3、界面如下: 二、单击事件 打开“src/com.genwoxue.datepickertimepicker/MainActivity.java”文件。 然后输入以下代码: 我们着重分析一下带有浅蓝色背景部分。 1、第①部分 导入与DatePicker与TimePicker相关的2个包。 2、第②部分 声明3个控件变量。 3、第③部分 (1)findViewById()方法完成3个控件的捕获。 (2)“保存”按钮添加单击监听事件:btnSave.setOnClickListener(new SaveOnClickListener())。 4、第④部分 getYear()、getMonth()、getDayOfMonth()方法获取年、月、日。 5、第⑤部分 getCurrentHour()、getCurrentMinute()方法获取时、分。 6、第⑥部分 使用Toast显示日期DatePicker、时间TimePicker控件选择的日期与时间。 效果如下: 三、附代码 1、activity_main.xml源码 TextCopy to clipboardPrint 1. 2. xmlns:tools="http://schemas.android.com/tools" 3. android:layout_width="match_parent" 4. android:layout_height="match_parent" 5. tools:context=".MainActivity" > 6. 7. 8. android:id="@+id/today" 9. android:layout_width="wrap_content" 10. android:layout_height="wrap_content" 11. android:layout_alignParentLeft="true" 12. android:layout_alignParentTop="true" /> 13. 14. 15. android:id="@+id/now" 16. android:layout_width="wrap_content" 17. android:layout_height="wrap_content" 18. android:layout_alignParentLeft="true" 19. android:layout_below="@+id/today" /> 20. 21. 22. android:id="@+id/save" 23. android:layout_width="wrap_content" 24. android:layout_height="wrap_content" 25. android:layout_below="@+id/now" 26. android:text="保存" /> 27. 28. 2、MainActivity.java源码 TextCopy to clipboardPrint 1. package com.genwoxue.datepickertimepicker; 2. 3. import android.os.Bundle; 4. import android.app.Activity; 5. import android.view.View; 6. import android.widget.DatePicker; 7. import android.widget.TimePicker; 8. import android.widget.Button; 9. import android.widget.Toast; 10. import android.view.View.OnClickListener; 11. 12. public class MainActivity extends Activity { 13. 14. private DatePicker dpToday=null; 15. private TimePicker tpNow=null; 16. private Button btnSave=null; 17. 18. @Override 19. protected void onCreate(Bundle savedInstanceState) { 20. super.onCreate(savedInstanceState); 21. setContentView(R.layout.activity_main); 22. 23. dpToday=(DatePicker)super.findViewById(R.id.today); 24. tpNow=(TimePicker)super.findViewById(R.id.now); 25. btnSave=(Button)super.findViewById(R.id.save); 26. btnSave.setOnClickListener(new SaveOnClickListener()); 27. } 28. 29. private class SaveOnClickListener implements OnClickListener{ 30. public void onClick(View view){ 31. int iYear=0; 32. int iMonth=0; 33. int iDay=0; 34. String sDate=""; 35. iYear=dpToday.getYear(); 36. iMonth=dpToday.getMonth()+1; 37. iDay=dpToday.getDayOfMonth(); 38. sDate="日期:"+String.valueOf(iYear)+"年"+String.valueOf(iMonth)+"月"+String.valueOf(iDay)+"日"; 39. 40. int iHour=0; 41. int iMin=0; 42. String sTime=""; 43. iHour=tpNow.getCurrentHour(); 44. iMin=tpNow.getCurrentMinute(); 45. sTime="时间:"+String.valueOf(iHour)+"时"+String.valueOf(iMin)+"分"; 46. 47. Toast.makeText(getApplicationContext(), sDate+sTime,Toast.LENGTH_LONG).show(); 48. } 49. } 50. } 第三篇:Android常见布局 第1章、 布局Layouts之LinearLayout线性布局 从Hello world!开始,我们一直都是在一种布局下学习的,当然,对于基础内容的学习,还是没有任何问题的!但—— 在Android开发中UI设计也是十分重要的,当用户使用一个App时,最先感受到的不是这款软件的功能是否强大,而是界面设计是否赏心悦目,用户体验是否良好。也可以这样说,有一个好的界面设计去吸引用户的使用,才能让更多的用户体验到软件功能的强大。 那么,Android中几种常用布局则显得至关重要。各个布局既可以单独使用,也可以嵌套使用,我们应该在实际应用中应灵活变通。 LinearLayout线性布局 LinearLayout是一种线型的布局方式。LinearLayout布局容器内的组件一个挨着一个地排列起来:不仅可以控制个组件横向排列,也可控制各组件纵向排列。通过orientation属性设置线性排列的方向是垂直(vertical)还是纵向(horizontal)。 我们下面通过XML布局和Java代码布局两种方式分别举例: 一、XML方式布局 1、创建一个空白Activity 2、打开“res/layout/activity_main.xml”文件,修改成以下代码。 (1)第①部分 ,每个XML文档都由XML序言开始,在前面的代码中的第一行便是XML序言,。这行代码表示按照1.0版本的XML规则进行解析。encoding = "utf-8"表示此xml文件采用utf-8的编码格式。编码格式也可以是GB2312。 如果你对此不太明白,请参阅相关XML文档。 (2)第②部分 (3)第③部分 android:layout_width="match_parent" android:layout_height="match_parent"表示布局管理器宽度和高充将填充整个屏幕宽度和高度。 (4)第④部分 android:orientation="vertical"表示布局管理器内组件采用垂直方向排列。 如果要采用水平方向请使用:horizontal。 3、插入三个按钮。 4、打开“res/layout/activity_main.xml”文件,修改成以下代码。 将3个按钮的android:layout_width的属性设为:"match_parent"。 该属性可以有三个值:wrap_content、match_parent、fill_parent。 wrap_content表示宽度匹配内容,简单地说就是文字有多长按钮就多长。 match_parent表示宽度匹配父内容,按钮外的容器有多宽就显示多宽。 fill_parent与match_parent相同,android2.2以后就不推荐使用了。 最终显示效果如下: 二、Java代码方式布局 上面我们已经了解采用XML进行LinearLayout布局,我们现在再来学习一下如何使用Java代码完成与之同样功能。 1、打开“src/com.genwoxue.LinearLayout/MainActivity.java”文件。 然后输入以下代码: 在以上代码中,我们着重分析一下带有浅蓝色背景部分。 (1)第①部分 导入与LinearLayout、LayoutParams、Button相关的包。 (2)第②部分 创建线性布局管理器,并且设置布局管理宽度和高度与方向。 LinearLayout llLayout=new LinearLayout(this):创建线性布局管理器; LayoutParams lpPara=new LayoutParams( LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT):创建布局参数,构造函数设置宽度与高度。用于设置线性布局管理器宽度与高度。 llLayout.setOrientation(LinearLayout.VERTICAL):设置布局管理器为垂直方向。 (3)第③部分 LayoutParams btnPara=new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT):创建布局参数,构造函数设置宽度与高度。用于设置三个按钮宽度与高度。 (4)第④部分 创建3个按钮:btnFourth、btnFifth、btnSixth,设置其文本与布局参数。 (5)第⑤部分 为线性布局管理器添加3个按钮。 (6)第⑥部分 super.addContentView(llLayout, lpPara):为当前activity添加布局管理器以及布局管理器的参数对象。 2、显示效果 第3章、 布局Layouts之RelativeLayout相对布局 RelativeLayout相对布局 RelativeLayout是一种相对布局,控件的位置是按照相对位置来计算的,后一个控件在什么位置依赖于前一个控件的基本位置,是布局最常用,也是最灵活的一种布局。 我们下面通过XML布局和Java代码布局两种方式分别举例: 一、XML方式布局 1、创建一个空白Activity 2、打开“res/layout/activity_main.xml”文件,修改成以下代码。 (1)第①部分 ,每个XML文档都由XML序言开始,在前面的代码中的第一行便是XML序言,。这行代码表示按照1.0版本的XML规则进行解析。encoding = "utf-8"表示此xml文件采用utf-8的编码格式。编码格式也可以是GB2312。 如果你对此不太明白,请参阅相关XML文档。 (2)第②部分 (3)第③部分 android:layout_width="match_parent" android:layout_height="match_parent"表示布局管理器宽度和高充将填充整个屏幕宽度和高度。 3、插入三个按钮。 插入三个按钮,并分别设置其文本为:“第一个按钮”、“第二个按钮”、“第三个按钮”。 我们下一步设置第一个按钮距离左边、上边各20dp,第二个按钮距离第一个按钮左边、上边各10dp;第三个按钮距离第二个按钮上边10dp,与第二个按钮左边对齐。 4、打开“res/layout/activity_main.xml”文件,修改成以下代码。 (1)第①部分 设置第一个按钮,以父元素为基准,贴紧左上,距离20dp。 TextCopy to clipboardPrint 1. 2. android:id="@+id/button1" 3. android:layout_width="wrap_content" //宽度匹配内容 4. android:layout_height="wrap_content" //高度匹配内容 5. android:layout_alignParentLeft="true" //贴紧父元素左边 6. android:layout_alignParentTop="true" //贴紧父元素上边 7. android:layout_marginLeft="20dp" //设置左间距20dp 8. android:layout_marginTop="20dp" //设置上间距20dp 9. android:text="第一个按钮" /> (2)第②部分 设置第二个按钮,以第一个按钮为基准,在第一个按钮下面,对齐第一个按钮的右边,上距离15dp。 TextCopy to clipboardPrint 1. 2. android:id="@+id/button2" 3. android:layout_width="wrap_content" //宽度匹配内容 4. android:layout_height="wrap_content" //高度匹配内容 5. android:layout_below="@+id/button1" //位置在第一个按钮的下面 6. android:layout_toRightOf="@+id/button1" //与第一个按钮的右边对齐 7. android:layout_marginTop="15dp" //设置上间距15dp 8. android:text="第二个按钮" /> (3)第③部分 设置第三个按钮,以第二个按钮为基准,在第二个按钮下面,对齐第二个按钮的左边,距离15dp。 TextCopy to clipboardPrint 1. 2. android:id="@+id/button3" 3. android:layout_width="wrap_content" //宽度匹配内容 4. android:layout_height="wrap_content" //高度匹配内容 5. android:layout_below="@+id/button2" //位置在第二个按钮的下面 6. android:layout_toLeftOf="@+id/button2" //与第二个按钮的左边对齐 7. android:layout_marginTop="15dp" //设置上间距15dp 8. android:text="第三个按钮" /> 最终显示效果如下: 附:相对布局常用属性介绍 这里将这些属性分成组,便于理解和记忆。 a)、第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:layout_centerInparent 相对于父元素完全居中 android:layout_alignParentBottom 贴紧父元素的下边缘 android:layout_alignParentLeft 贴紧父元素的左边缘 android:layout_alignParentRight 贴紧父元素的右边缘 android:layout_alignParentTop 贴紧父元素的上边缘 b)、第二类:属性值必须为id的引用名“@id/id-name” android:layout_below 在某元素的下方 android:layout_above 在某元素的的上方 android:layout_toLeftOf 在某元素的左边 android:layout_toRightOf 在某元素的右边 android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐 android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐 android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐 android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐 c)、第三类:属性值为具体的像素值,如30dip,40px android:layout_marginBottom 离某元素底边缘的距离 android:layout_marginLeft 离某元素左边缘的距离 android:layout_marginRight 离某元素右边缘的距离 android:layout_marginTop 离某元素上边缘的距离 可以通过组合这些属性来实现各种各样的布局。 第4章、 布局Layouts之FrameLayout框架布局 FrameLayout单桢布局 FrameLayout对象好比一块在屏幕上提前预定好的空白区域,可以将一些元素填充在里面,如图片。所有元素都被放置在FrameLayout区域的最左上区域,而且无法为这些元素制指定一个确切的位置,若有多个元素,那么后面的元素会重叠显示在前一个元素上。 我们下面通过XML布局和Java代码布局两种方式分别举例: 一、XML方式布局 1、首先把a.jpg图片复制到res/drawable-hdpi文件夹内。 2、创建一个空白Activity 3、打开“res/layout/activity_main.xml”文件,修改成以下代码。 (1)第①部分 ,每个XML文档都由XML序言开始,在前面的代码中的第一行便是XML序言,。这行代码表示按照1.0版本的XML规则进行解析。encoding = "utf-8"表示此xml文件采用utf-8的编码格式。编码格式也可以是GB2312。 (2)第②部分 (3)第③部分 android:layout_width="match_parent" android:layout_height="match_parent"表示布局管理器宽度和高充将填充整个屏幕宽度和高度。 4、从工具栏向activity拖出1个图像ImageView、1个按钮Button。 5、打开“res/layout/activity_main.xml”文件。 (1)第①部分 ID为imageView1的图像ImageView显示一幅图片。 (2)第②部分 ID为button1的按钮Button显示一个按钮。 由于是单帧FrameLayout布局,这两个控件不能够进行任何布局,只能以左上角为基准,重叠摆放。 6、最终显示效果如下: 如果FrameLayout单帧布局仅此而已,则可以说毫无价值! 最重要的是多种布局方式进行嵌套也许才更有意义,这个在稍后的章节我们再说,如果你对FrameLayout感觉迷茫,可以先看一篇:http://www.linuxidc.com/Linux/2011-12/49200p2.htm 二、Java代码方式布局 上面我们已经了解采用XML进行LinearLayout布局,我们现在再来学习一下如何使用Java代码完成与之同样功能。 暂略。 第5章、 布局Layouts之TableLayout表格布局 TableLayout表格布局 TableLayout是指将子元素的位置分配到行或列中。Android的一个TableLayout有许多TableRow组成,每一个TableRow都会定义一个Row。TableLayout容器不会显示Row,Column,及Cell的边框线,每个Row拥有0个或多个Cell,每个Cell拥有一个View对象。 在使用tablelayout时,应注意每一个cell的宽度。 我们下面通过XML布局和Java代码布局两种方式分别举例: 一、XML方式布局 1、创建一个空白Activity 2、打开“res/layout/activity_main.xml”文件,修改成以下代码。 (1)第①部分 ,每个XML文档都由XML序言开始,在前面的代码中的第一行便是XML序言,。这行代码表示按照1.0版本的XML规则进行解析。encoding = "utf-8"表示此xml文件采用utf-8的编码格式。编码格式也可以是GB2312。 (2)第②部分 (3)第③部分 android:layout_width="match_parent" android:layout_height="match_parent"表示布局管理器宽度和高充将填充整个屏幕宽度和高度。 (4)第④部分 android:stretchColumns="1"表示表格布局管理器中第2列内组件可以扩充到的有可用空间。 3、插入1行TableRow、1个文本TextView、1个TextEdit。 4、打开“res/layout/activity_main.xml”文件,修改成以下代码。 (1)第①部分 代表一行,可以在其中填充控件。 (2)第②部分 添加一个标签。 (3)第③部分 添加一个编辑框。 5、依次再插入2行、密码标签、密码编辑框、2个按钮Button:注册、登录。 代码如下: TextCopy to clipboardPrint 1. 2. 3. 4. xmlns:android="http://schemas.android.com/apk/res/android" 5. android:layout_width="match_parent" 6. android:layout_height="match_parent" 7. android:stretchColumns="1"> 8. //第一行 9. 10. android:id="@+id/tableRow1" 11. android:layout_width="wrap_content" 12. android:layout_height="wrap_content" > 13. 14. 15. android:id="@+id/tvUserName" 16. android:layout_width="wrap_content" 17. android:layout_height="wrap_content" 18. android:text="用户名:" /> 19. 20. 21. android:id="@+id/etUserName" 22. android:layout_width="wrap_content" 23. android:layout_height="wrap_content" 24. android:ems="10" > 25. 26. 27. 28. 29. 30. //第二行 31. 32. android:id="@+id/tableRow2" 33. android:layout_width="wrap_content" 34. android:layout_height="wrap_content" > 35. 36. android:text="登录密码:" 37. android:textStyle="bold" 38. android:gravity="right" 39. android:padding="3dp" /> 40. 41. android:id="@+id/password" 42. android:password="true" 43. android:padding="3dp" 44. android:scrollHorizontally="true" /> 45. 46. //第三行 47. 48. android:id="@+id/tableRow3" 49. android:layout_width="wrap_content" 50. android:layout_height="wrap_content" > 51. 52. android:id="@+id/cancel" 53. android:text="注册" /> 54. 55. android:id="@+id/login" 56. android:text="登录" /> 57. 58. 59. 6、最终显示效果如下: 附:表格布局常见属性介绍 (1)TableLayout行列数的确定 TableLayout的行数由开发人员直接指定,即有多少个TableRow对象(或View控件),就有多少行。 TableLayout的列数等于含有最多子控件的TableRow的列数。如第一TableRow含2个子控件,第二个TableRow含3个,第三个TableRow含4个,那么该TableLayout的列数为4. (2)TableLayout可设置的属性详解 TableLayout可设置的属性包括全局属性及单元格属性。 a)全局属性也即列属性,有以下3个参数: android:stretchColumns 设置可伸展的列。该列可以向行方向伸展,最多可占据一整行。 android:shrinkColumns 设置可收缩的列。当该列子控件的内容太多,已经挤满所在行,那么该子控件的内容将往列方向显示。 android:collapseColumns 设置要隐藏的列。 示例: android:stretchColumns="0" 第0列可伸展 android:shrinkColumns="1,2" 第1,2列皆可收缩 android:collapseColumns="*" 隐藏所有行 说明:列可以同时具备stretchColumns及shrinkColumns属性,若此,那么当该列的内容N多时,将“多行”显示其内容。(这里不是真正的多行,而是系统根据需要自动调节该行的layout_height) b)单元格属性,有以下2个参数: android:layout_column 指定该单元格在第几列显示 android:layout_span 指定该单元格占据的列数(未指定时,为1) 示例: android:layout_column="1" 该控件显示在第1列 android:layout_span="2" 该控件占据2列 说明:一个控件也可以同时具备这两个特性。 二、Java代码方式布局 上面我们已经了解采用XML进行LinearLayout布局,我们现在再来学习一下如何使用Java代码完成与之同样功能。 Java代码方式暂略。 第6章、 布局Layouts之GridLayout网格布局 第5章、布局Layouts之GridLayout网格布局 GridLayout网格布局 android4.0以上版本出现的GridLayout布局解决了以上问题。GridLayout布局使用虚细线将布局划分为行、列和单元格,也支持一个控件在行、列上都有交错排列。而GridLayout使用的其实是跟LinearLayout类似的API,只不过是修改了一下相关的标签而已,所以对于开发者来说,掌握GridLayout还是很容易的事情。GridLayout的布局策略简单分为以下三个部分: 首先它与LinearLayout布局一样,也分为水平和垂直两种方式,默认是水平布局,一个控件挨着一个控件从左到右依次排列,但是通过指定android:columnCount设置列数的属性后,控件会自动换行进行排列。另一方面,对于GridLayout布局中的子控件,默认按照wrap_content的方式设置其显示,这只需要在GridLayout布局中显式声明即可。 其次,若要指定某控件显示在固定的行或列,只需设置该子控件的android:layout_row和android:layout_column属性即可,但是需要注意:android:layout_row=”0”表示从第一行开始,android:layout_column=”0”表示从第一列开始,这与编程语言中一维数组的赋值情况类似。 最后,如果需要设置某控件跨越多行或多列,只需将该子控件的android:layout_rowSpan或者layout_columnSpan属性设置为数值,再设置其layout_gravity属性为fill即可,前一个设置表明该控件跨越的行数或列数,后一个设置表明该控件填满所跨越的整行或整列。 我们下面通过XML布局和Java代码布局两种方式分别举例: 一、XML方式布局 1、创建一个空白Activity 3、打开“res/layout/activity_main.xml”文件,修改成以下代码。 (1)第①部分 ,每个XML文档都由XML序言开始,在前面的代码中的第一行便是XML序言,。这行代码表示按照1.0版本的XML规则进行解析。encoding = "utf-8"表示此xml文件采用utf-8的编码格式。编码格式也可以是GB2312。 (2)第②部分 (3)第③部分 android:layout_width="match_parent" android:layout_height="match_parent"表示布局管理器宽度和高充将填充整个屏幕宽度和高度。 (4)第④部分 android:orientation="horizontal"表示采用水平布局,垂直为vertical。 (5)第⑤部分 该网格布局管理器采用5行4列。 4、我们向GridLayout放入16个按钮Button。 5、找不同。 我们对一下,找出不同地方。 (1)第①部分 目标0按钮是占据2个格;当前0按钮占1格。 TextCopy to clipboardPrint 1. 2. android:id="@+id/zero" 3. android:layout_columnSpan="2" //列扩展两列 4. android:layout_gravity="fill" //按钮填充满两格 5. android:text="0"/> (2)第②部分 目标•按钮在第4行第3列;当前•按钮在第4行第2列。 解决办法:0按钮占据2格后,•按钮会自动到这个位置。 (3)第③部分 目标+按钮在第4行第4列并且行扩展2行;当前•按钮在第4行第3列。 解决办法:由于0按钮占据2格后,目标+会自动到这个位置。 TextCopy to clipboardPrint 1. 2. android:id="@+id/plus" 3. android:layout_rowSpan="2" //行扩展两行 4. android:layout_gravity="fill" //按钮填充满两格 5. android:text="+"/> (4)第④部分 目标=按钮在第5行,占据3列位置;当前=按钮在第4行第4列。 解决办法:位置由于0的扩展后,目前=按钮会自动到第5行;列扩展同0按钮。 TextCopy to clipboardPrint 1. 2. android:id="@+id/equal" 3. android:layout_columnSpan="3" //列扩展3列 4. android:layout_gravity="fill" //按钮填充满3格 5. android:text="="/> 完整源代码: TextCopy to clipboardPrint 1. 2. 3. xmlns:android="http://schemas.android.com/apk/res/android" 4. android:layout_width="wrap_content" 5. android:layout_height="wrap_content" 6. android:orientation="horizontal" //水平方向 7. android:rowCount="5" //5行 8. android:columnCount="4" > //4列 TextCopy to clipboardPrint 1. //16个按钮 2. 3. android:id="@+id/one" 4. android:text="1"/> 5. 6. android:id="@+id/two" 7. android:text="2"/> 8. 9. android:id="@+id/three" 10. android:text="3"/> 11. 12. android:id="@+id/devide" 13. android:text="/"/> 14. 15. android:id="@+id/four" 16. android:text="4"/> 17. 18. android:id="@+id/five" 19. android:text="5"/> 20. 21. android:id="@+id/six" 22. android:text="6"/> 23. 24. android:id="@+id/multiply" 25. android:text="×"/> 26. 27. android:id="@+id/seven" 28. android:text="7"/> 29. 30. android:id="@+id/eight" 31. android:text="8"/> 32. 33. android:id="@+id/nine" 34. android:text="9"/> 35. 36. android:id="@+id/minus" 37. android:text="-"/> 38. 39. android:id="@+id/zero" 40. android:layout_columnSpan="2" 41. android:layout_gravity="fill" 42. android:text="0"/> 43. 44. android:id="@+id/point" 45. android:text="."/> 46. 47. android:id="@+id/plus" 48. android:layout_rowSpan="2" 49. android:layout_gravity="fill" 50. android:text="+"/> 51. 52. android:id="@+id/equal" 53. android:layout_columnSpan="3" 54. android:layout_gravity="fill" 55. android:text="="/> TextCopy to clipboardPrint 1. 6、最终显示效果如下: 二、Java代码方式布局 上面我们已经了解采用XML进行LinearLayout布局,我们现在再来学习一下如何使用Java代码完成与之同样功能。 暂略。 题外话: TextCopy to clipboardPrint 1. AbsoluteLayout绝对布局 2. 3. AbsoluteLayout绝对布局犹如div指定了absolute属性,用X,Y坐标来指定元素的位置! 4. 5. 该布局目前已经淘汰,知道就行了! 第四篇:Android事件 第1章、 基于监听器的事件处理 事件,我们并不陌生! 所有的基于UI的应用程序,事件都变得不可或缺!试想一下,如果我们做的程序单击按钮和其它控件都没有反应,那么就如同一个人在这个世界上听不到声音一样! Android为我们提供了两种方式的事件处理:(1)基于监听器的事件处理;(2)基于回调的事件处理。 对于基于监听器的事件处理而言,主要就是为Android界面组件绑定特定的事件监听器;对于基于回调的事件处理而言,主要做法是重写Android组件特定的回调函数,Android大部分界面组件都提供了事件响应的回调函数,我们只要重写它们就行。 本章我们着重讲一下基于监听器的事件处理,基于回调的事件处理放在下一章讲解。 相比于基于回调的事件处理,这是更具“面向对象”性质的事件处理方式。在监听器模型中,主要涉及三类对象: (1)事件源Event Source:产生事件的来源,通常是各种组件,如按钮,窗口等。 (2)事件Event:事件封装了界面组件上发生的特定事件的具体信息,如果监听器需要获取界面组件上所发生事件的相关信息,一般通过事件Event对象来传递。 (3)事件监听器Event Listener:负责监听事件源发生的事件,并对不同的事件做相应的处理。 一、第一种:内部类作为监听器 将事件监听器类定义成当前类的内部类。 a)使用内部类可以在当前类中复用监听器类,因为监听器类是外部类的内部类。 b)可以自由访问外部类的所有界面组件,这也是内部类的两个优势。 我们前面的例子全部采用的该种方式! 我们可以一起回顾一下:http://blog.csdn.net/jianghuiquan/article/details/8252430 1、activity_main.xml界面文件 TextCopy to clipboardPrint 1. 2. xmlns:tools="http://schemas.android.com/tools" 3. android:layout_width="match_parent" 4. android:layout_height="match_parent" 5. tools:context=".MainActivity" > 6. 7. 8. android:id="@+id/userName" 9. android:layout_width="wrap_content" 10. android:layout_height="wrap_content" 11. android:layout_alignParentLeft="true" 12. android:layout_alignParentTop="true" 13. android:layout_marginTop="34dp" 14. android:ems="10" > 15. 16. 17. 18. 19. 20. android:id="@+id/passWord" 21. android:layout_width="wrap_content" 22. android:layout_height="wrap_content" 23. android:layout_alignParentLeft="true" 24. android:layout_below="@+id/userName" 25. android:layout_marginTop="18dp" 26. android:ems="10" 27. android:inputType="textPassword" /> 28. //定义了一个ID为login的按钮 29. 30. android:id="@+id/login" 31. android:layout_width="wrap_content" 32. android:layout_height="wrap_content" 33. android:layout_alignRight="@+id/userName" 34. android:layout_below="@+id/passWord" 35. android:layout_marginTop="36dp" 36. android:text="登录" /> 37. 38. 2、MainActivity.java程序文件 TextCopy to clipboardPrint 1. package com.genwoxue.edittextbutton; 2. 3. import android.os.Bundle; 4. import android.app.Activity; 5. import android.widget.EditText; 6. import android.widget.Button; 7. import android.view.View; 8. import android.view.View.OnClickListener; 9. import android.widget.Toast; 10. 11. 12. public class MainActivity extends Activity { 13. private EditText tvUserName=null; 14. private EditText tvPassword=null; 15. private Button btnLogin=null; 16. 17. @Override 18. protected void onCreate(Bundle savedInstanceState) { 19. super.onCreate(savedInstanceState); 20. setContentView(R.layout.activity_main); 21. 22. tvUserName=(EditText)super.findViewById(R.id.userName); 23. tvPassword=(EditText)super.findViewById(R.id.passWord); 24. btnLogin=(Button)super.findViewById(R.id.login); 25. 26. //为按钮注册监听事件 27. btnLogin.setOnClickListener(new LoginOnClickListener()); 28. } 29. //事件监听器 30. private class LoginOnClickListener implements OnClickListener{ 31. public void onClick(View v){ 32. String username=tvUserName.getText().toString(); 33. String password=tvPassword.getText().toString(); 34. String info="用户名:"+username+"☆☆☆密码:"+password; 35. Toast.makeText(getApplicationContext(), info,Toast.LENGTH_SHORT).show(); 36. } 37. } 38. } 上面的理论也许听起来让你头大,尤其java这一套事件监听模型,让很多尽管可能是其它语言编程高手也感觉甚不适应,但如果分析上面代码,则发现实际也是非常简单的。 我们这个案例中:单击按钮,显示用户名和密码! 事件:单击事件; (1)注册监听事件:btnLogin.setOnClickListener(new LoginOnClickListener()); (2)事件监听器:private class LoginOnClickListener implements OnClickListener 定义LoginOnClickListener类,从OnClickListener接口实现。 就这么简单! 二、第二种:匿名内部类作为事件监听器类 如果事件监听器只是临时使用一次,建议使用匿名内部类形式的事件监听器更合适。 我们仍然以上述例子为例,加以改造,学习一下如何使用“匿名内部类作为事件监听器类”。 1、界面部分不变! activity_main.xml界面文件 TextCopy to clipboardPrint 1. 2. xmlns:tools="http://schemas.android.com/tools" 3. android:layout_width="match_parent" 4. android:layout_height="match_parent" 5. tools:context=".MainActivity" > 6. 7. 8. android:id="@+id/userName" 9. android:layout_width="wrap_content" 10. android:layout_height="wrap_content" 11. android:layout_alignParentLeft="true" 12. android:layout_alignParentTop="true" 13. android:layout_marginTop="34dp" 14. android:ems="10" > 15. 16. 17. 18. 19. 20. android:id="@+id/passWord" 21. android:layout_width="wrap_content" 22. android:layout_height="wrap_content" 23. android:layout_alignParentLeft="true" 24. android:layout_below="@+id/userName" 25. android:layout_marginTop="18dp" 26. android:ems="10" 27. android:inputType="textPassword" /> 28. //定义了一个ID为login的按钮 29. 30. android:id="@+id/login" 31. android:layout_width="wrap_content" 32. android:layout_height="wrap_content" 33. android:layout_alignRight="@+id/userName" 34. android:layout_below="@+id/passWord" 35. android:layout_marginTop="36dp" 36. android:text="登录" /> 37. 38. 2、源程序加以改造! MainActivity.java程序文件 TextCopy to clipboardPrint 1. package com.genwoxue.anonymousinside; 2. import android.os.Bundle; 3. import android.app.Activity; 4. import android.widget.EditText; 5. import android.widget.Button; 6. import android.view.View; 7. import android.view.View.OnClickListener; 8. import android.widget.Toast; 9. public class MainActivity extends Activity { 10. private EditText tvUserName=null; 11. private EditText tvPassword=null; 12. private Button btnLogin=null; 13. @Override 14. protected void onCreate(Bundle savedInstanceState) { 15. super.onCreate(savedInstanceState); 16. setContentView(R.layout.activity_main); 17. 18. tvUserName=(EditText)super.findViewById(R.id.userName); 19. tvPassword=(EditText)super.findViewById(R.id.passWord); 20. btnLogin=(Button)super.findViewById(R.id.login); 21. btnLogin.setOnClickListener(new OnClickListener(){ 22. public void onClick(View v){ 23. String username=tvUserName.getText().toString(); 24. String password=tvPassword.getText().toString(); 25. String info="用户名:"+username+"☆☆☆密码:"+password; 26. Toast.makeText(getApplicationContext(), info,Toast.LENGTH_SHORT).show(); 27. } 28. }); 29. } 30. } 三、对比 我们对比一下这两种写法: 1、第①种 (1)注册:btnLogin.setOnClickListener(new LoginOnClickListener()); (2)内部类: TextCopy to clipboardPrint 1. private class LoginOnClickListener implements OnClickListener{ 2. public void onClick(View v){ 3. String username=tvUserName.getText().toString(); 4. String password=tvPassword.getText().toString(); 5. String info="用户名:"+username+"☆☆☆密码:"+password; 6. Toast.makeText(getApplicationContext(), info,Toast.LENGTH_SHORT).show(); 7. } 2、第②种 实际上是把①种合二为一了,使用匿名内部类直接完成了。 TextCopy to clipboardPrint 1. btnLogin.setOnClickListener(new OnClickListener(){ 2. public void onClick(View v){ 3. String username=tvUserName.getText().toString(); 4. String password=tvPassword.getText().toString(); 5. String info="用户名:"+username+"☆☆☆密码:"+password; 6. Toast.makeText(getApplicationContext(), info,Toast.LENGTH_SHORT).show(); 7. } 8. }); 第2章、 OnCheckedChangeListener事件 单选按钮RadioGroup、复选框CheckBox都有OnCheckedChangeListener事件,我们一起了解一下。 一、布局 1、打开“res/layout/activity_main.xml”文件。 TextCopy to clipboardPrint 1. 2. xmlns:android="http://schemas.android.com/apk/res/android" 3. xmlns:tools="http://schemas.android.com/tools" 4. android:layout_width="match_parent" 5. android:layout_height="match_parent" 6. tools:context=".MainActivity" > 7. 8. 9. android:id="@+id/gender" 10. android:layout_width="wrap_content" 11. android:layout_height="wrap_content" 12. android:layout_alignParentLeft="true" 13. android:layout_alignParentTop="true" > 14. 15. android:id="@+id/male" 16. android:layout_width="wrap_content" 17. android:layout_height="wrap_content" 18. android:checked="true" 19. android:text="男" /> 20. 21. android:id="@+id/female" 22. android:layout_width="wrap_content" 23. android:layout_height="wrap_content" 24. android:text="女" /> 25. 26. 27. 28. android:id="@+id/football" 29. android:layout_width="wrap_content" 30. android:layout_height="wrap_content" 31. android:layout_alignParentLeft="true" 32. android:layout_below="@+id/gender" 33. android:text="足球" /> 34. 35. android:id="@+id/basketball" 36. android:layout_width="wrap_content" 37. android:layout_height="wrap_content" 38. android:layout_alignParentLeft="true" 39. android:layout_below="@+id/football" 40. android:text="蓝球" /> 41. 42. 2、界面如下: 二、OnCheckedChangeListener事件 打开“src/com.genwoxue.oncheckedchanged/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.oncheckedchanged; 2. 3. import android.os.Bundle; 4. import android.app.Activity; 5. import android.widget.RadioGroup; 6. import android.widget.RadioButton; 7. import android.widget.RadioGroup.OnCheckedChangeListener; //引入OnCheckedChangeListener事件相关包 8. import android.widget.CheckBox; 9. import android.widget.CompoundButton; 10. import android.widget.Toast; 11. 12. 13. public class MainActivity extends Activity { 14. private RadioGroup GenderGroup=null; 15. private RadioButton rbMale=null; 16. private RadioButton rbFemale=null; 17. private CheckBox cbFootBall=null; 18. private CheckBox cbBasketBall=null; 19. 20. @Override 21. protected void onCreate(Bundle savedInstanceState) { 22. super.onCreate(savedInstanceState); 23. setContentView(R.layout.activity_main); 24. 25. GenderGroup=(RadioGroup)super.findViewById(R.id.gender); 26. rbMale=(RadioButton)super.findViewById(R.id.male); 27. rbFemale=(RadioButton)super.findViewById(R.id.female); 28. cbFootBall=(CheckBox)super.findViewById(R.id.football); 29. cbBasketBall=(CheckBox)super.findViewById(R.id.basketball); 30. //在GenderGroup注册OnCheckedChangeListener事件 31. GenderGroup.setOnCheckedChangeListener(new GenderOnCheckedChangeListener()); 32. //在cbFootBall注册OnCheckedChangeListener事件 33. cbFootBall.setOnCheckedChangeListener(new BootBallOnCheckedChangeListener()); 34. //在cbBasketBall注册OnCheckedChangeListener事件 35. 36. cbBasketBall.setOnCheckedChangeListener(new BasketBallOnCheckedChangeListener()); 37. } 38. 39. private class GenderOnCheckedChangeListener implements OnCheckedChangeListener{ 40. @Override 41. public void onCheckedChanged(RadioGroup group,int checkedId){ 42. String sGender=""; 43. if(rbFemale.getId()==checkedId){ 44. sGender=rbFemale.getText().toString(); 45. } 46. if(rbMale.getId()==checkedId){ 47. sGender=rbMale.getText().toString(); 48. } 49. Toast.makeText(getApplicationContext(), "您选择的性别是:"+sGender, Toast.LENGTH_LONG).show(); 50. } 51. 52. } 53. 54. private class BootBallOnCheckedChangeListener implements CompoundButton.OnCheckedChangeListener{ 55. @Override 56. public void onCheckedChanged(CompoundButton button, boolean isChecked){ 57. String sFav=""; 58. if(isChecked){ 59. sFav=cbFootBall.getText().toString(); 60. sFav=sFav+"选中!"; 61. } 62. else 63. sFav=sFav+"未迁中"; 64. Toast.makeText(getApplicationContext(), "您选择的爱好是:"+sFav, Toast.LENGTH_LONG).show(); 65. } 66. } 67. 68. private class BasketBallOnCheckedChangeListener implements CompoundButton.OnCheckedChangeListener{ 69. @Override 70. public void onCheckedChanged(CompoundButton button,boolean isChecked){ 71. String sFav=""; 72. if(cbBasketBall.isChecked()){ 73. sFav=cbBasketBall.getText().toString(); 74. sFav=sFav+"选中!"; 75. } 76. else 77. sFav=sFav+"未迁中"; 78. Toast.makeText(getApplicationContext(), "您选择的爱好是:"+sFav, Toast.LENGTH_LONG).show(); 79. } 80. } 81. 82. } 尽管单选按钮和复选框都有OnCheckedChange事件,但注意二者区别。 效果如下: 第3章、OnItemSelectedListener事件 在Android App应用中,OnItemSelectedListener事件也会经常用到,我们一起来了解一下。 基本知识点:OnItemSelectedListener事件 一、界面 1、新建province.xml件。 在“res/values”位置新建province.xml文件。 (1)province.xml文件位置如下图所示: (2)province.xml内容如下: (3)代码 TextCopy to clipboardPrint 1. 2. 3. 4. - 河南省
5. - 河北省
6. - 山东省
7. - 山西省
8. 9. 2、打开“res/layout/activity_main.xml”文件。 (1)分别从工具栏向activity拖出1个下拉列表框Spinner。控件来自Form Widgets。 (2)打开activity_main.xml文件。 TextCopy to clipboardPrint 1. 2. xmlns:tools="http://schemas.android.com/tools" 3. android:layout_width="match_parent" 4. android:layout_height="match_parent" 5. tools:context=".MainActivity" > 6. 7. 8. android:id="@+id/province" 9. android:layout_width="wrap_content" 10. android:layout_height="wrap_content" 11. android:layout_alignParentLeft="true" 12. android:layout_alignParentTop="true" 13. android:entries="@array/provarray" /> 14. 15. 3、界面如下 二、OnItemSelectedListener事件 1、打开“src/com.genwoxue.onitemselected/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.onitemselected; 2. 3. import android.os.Bundle; 4. import android.app.Activity; 5. import android.view.View; 6. import android.widget.Spinner; 7. import android.widget.Toast; 8. import android.widget.AdapterView; 9. import android.widget.AdapterView.OnItemSelectedListener; 10. 11. 12. public class MainActivity extends Activity { 13. //声明Spinner对象 14. private Spinner spinProvince=null; 15. 16. @Override 17. protected void onCreate(Bundle savedInstanceState) { 18. super.onCreate(savedInstanceState); 19. setContentView(R.layout.activity_main); 20. //获取Spinner 21. spinProvince=(Spinner)super.findViewById(R.id.province); 22. //注册OnItemSelected事件 23. spinProvince.setOnItemSelectedListener(new ProvOnItemSelectedListener()); 24. } 25. 26. //OnItemSelected监听器 27. private class ProvOnItemSelectedListener implements OnItemSelectedListener{ 28. @Override 29. public void onItemSelected(AdapterView> adapter,View view,int position,long id) { 30. //获取选择的项的值 31. String sInfo=adapter.getItemAtPosition(position).toString(); 32. Toast.makeText(getApplicationContext(), sInfo, Toast.LENGTH_LONG).show(); 33. } 34. 35. @Override 36. public void onNothingSelected(AdapterView> arg0) { 37. String sInfo="什么也没选!"; 38. Toast.makeText(getApplicationContext(),sInfo, Toast.LENGTH_LONG).show(); 39. 40. } 41. } 42. } 2、最终效果如下: 第3章、 OnItemSelectedListener事件与二级联动 在Android App应用中,二级联动是应用极为广泛的,我们在上一章的基础上来学习一下如何实现。 基本知识点:OnItemSelectedListener事件 一、界面 1、新建province.xml件。 在“res/values”位置新建province.xml文件。 (1)province.xml文件位置如下图所示: (2)province.xml内容如下: (3)代码 [html] view plaincopyprint? 1. 2. 3. 4. - 河南省
5. - 河北省
6. - 山东省
7. - 山西省
8. 9. 2、打开“res/layout/activity_main.xml”文件。 (1)分别从工具栏向activity拖出2个下拉列表框Spinner。控件来自Form Widgets。 (2)打开activity_main.xml文件。 TextCopy to clipboardPrint 1. 2. 3. xmlns:android="http://schemas.android.com/apk/res/android" 4. android:layout_width="match_parent" 5. android:layout_height="match_parent" > 6. 7. 8. android:id="@+id/province" 9. android:layout_width="wrap_content" 10. android:layout_height="wrap_content" 11. android:entries="@array/provarray" /> 12. 13. 14. android:id="@+id/city" 15. android:layout_width="wrap_content" 16. android:layout_height="wrap_content" /> 17. 18. 3、界面如下 二、OnItemSelectedListener事件 1、打开“src/com.genwoxue.twolevelmenu/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.twolevelmenu; 2. 3. import android.os.Bundle; 4. import android.app.Activity; 5. import android.view.View; 6. import android.widget.Spinner; 7. import android.widget.Toast; 8. import android.widget.ArrayAdapter; 9. import android.widget.AdapterView; 10. import android.widget.AdapterView.OnItemSelectedListener; 11. 12. 13. public class MainActivity extends Activity { 14. 15. //声明Spinner对像 16. private Spinner spinProvince=null; 17. private Spinner spinCity=null; 18. //定义城市数据,用于二级菜单 19. private String[][] arrCity=new String[][]{ 20. {"郑州","开封","洛阳","安阳"}, 21. {"石家庄","保定","邯郸","张家口"}, 22. {"济南","青岛","烟台","日照"}, 23. {"太原","晋中","吕梁","临汾"}}; 24. //声明数组适配器,用来填充城市列表 25. private ArrayAdapter adapterCity=null; 26. 27. @Override 28. protected void onCreate(Bundle savedInstanceState) { 29. super.onCreate(savedInstanceState); 30. setContentView(R.layout.activity_main); 31. //获取Spinner对象 32. spinProvince=(Spinner)super.findViewById(R.id.province); 33. spinCity=(Spinner)super.findViewById(R.id.city); 34. //为spinProvince控件注册OnItemSelected监听器 35. spinProvince.setOnItemSelectedListener(new ProvOnItemSelectedListener()); 36. //为spinCity控件注册OnItemSelected监听器 37. spinCity.setOnItemSelectedListener(new CityOnItemSelectedListener()); 38. } 39. 40. //OnItemSelected监听器 41. private class ProvOnItemSelectedListener implements OnItemSelectedListener{ 42. //选择省份,触发城市下拉列表框 43. @Override 44. public void onItemSelected(AdapterView> adapter,View view,int position,long id) { 45. //使用ArrayAdapter转换数据 46. MainActivity.this.adapterCity=new ArrayAdapter( 47. MainActivity.this, 48. android.R.layout.simple_spinner_item, 49. MainActivity.this.arrCity[position]); 50. //使用adapterCity数据适配器填充spinCity 51. MainActivity.this.spinCity.setAdapter(MainActivity.this.adapterCity); 52. 53. } 54. 55. @Override 56. public void onNothingSelected(AdapterView> arg0) { 57. //没有选择时执行 58. } 59. } 60. //OnItemSelected监听器 61. private class CityOnItemSelectedListener implements OnItemSelectedListener{ 62. //选择城市,触发显示选择的城市 63. @Override 64. public void onItemSelected(AdapterView> adapter,View view,int position,long id) { 65. //获取选择的项的值 66. String sInfo=adapter.getItemAtPosition(position).toString(); 67. Toast.makeText(getApplicationContext(), sInfo, Toast.LENGTH_LONG).show(); 68. } 69. @Override 70. public void onNothingSelected(AdapterView> arg0) { 71. //没有选择时执行 72. } 73. } 74. } 2、最终效果如下: 第4章、 OnFocuChangeListener焦点事件 第5章、OnFocuChangeListener焦点事件 在Android App应用中,OnFocuChangeListener焦点事件是必不可少的,我们在上一章的基础上来学习一下如何实现。 基本知识点:OnFocuChangeListener事件 一、界面 打开“res/layout/activity_main.xml”文件。 1、分别从工具栏向activity拖出2个编辑框EditText。控件来自Form Widgets。 2、打开activity_main.xml文件。 TextCopy to clipboardPrint 1. 2. xmlns:android="http://schemas.android.com/apk/res/android" 3. android:layout_width="match_parent" 4. android:layout_height="match_parent" 5. android:orientation="vertical" > 6. 7. 8. android:id="@+id/mobile" 9. android:layout_width="190dp" 10. android:layout_height="wrap_content" 11. android:text="手机号码" /> 12. 13. 14. android:id="@+id/address" 15. android:layout_width="190dp" 16. android:layout_height="wrap_content" 17. android:text="地址" /> 18. 19. 3、界面如下 二、OnItemSelectedListener事件 1、打开“src/com.genwoxue.onfocuchange/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.onfocuchange; 2. 3. import android.os.Bundle; 4. import android.app.Activity; 5. import android.view.View; 6. import android.widget.EditText; 7. import android.view.View.OnClickListener; 8. import android.view.View.OnFocusChangeListener; 9. import android.widget.Toast; 10. 11. public class MainActivity extends Activity { 12. //声明EditText 13. private EditText etMobile=null; 14. private EditText etAddress=null; 15. 16. @Override 17. protected void onCreate(Bundle savedInstanceState) { 18. super.onCreate(savedInstanceState); 19. setContentView(R.layout.activity_main); 20. //获取EditText 21. etMobile=(EditText)super.findViewById(R.id.mobile); 22. etAddress=(EditText)super.findViewById(R.id.address); 23. //注册OnClick、OnFocusChange监听器 24. etMobile.setOnClickListener(new MobileOnClickListener()); 25. etMobile.setOnFocusChangeListener(new MobileOnFocusChanageListener()); 26. etAddress.setOnClickListener(new AddressOnClickListener()); 27. etAddress.setOnFocusChangeListener(new AddressOnFocusChanageListener()); 28. } 29. //MobileOnClickListener单击监听器 30. private class MobileOnClickListener implements OnClickListener{ 31. @Override 32. public void onClick(View view){ 33. etMobile.setText(""); 34. } 35. } 36. //MobileOnFocusChanageListener焦点监听器 37. private class MobileOnFocusChanageListener implements OnFocusChangeListener{ 38. @Override 39. public void onFocusChange(View view,boolean hasFocus){ 40. if(view.getId()==etMobile.getId()) 41. Toast.makeText(getApplicationContext(), "手机文本框获得焦点!",Toast.LENGTH_LONG).show(); 42. } 43. } 44. //MobileOnClickListener单击监听器 45. private class AddressOnClickListener implements OnClickListener{ 46. @Override 47. public void onClick(View view){ 48. etAddress.setText(""); 49. } 50. } 51. //MobileOnFocusChanageListener焦点监听器 52. private class AddressOnFocusChanageListener implements OnFocusChangeListener{ 53. @Override 54. public void onFocusChange(View view,boolean hasFocus){ 55. if(view.getId()==etAddress.getId()) 56. Toast.makeText(getApplicationContext(), "地址文本框获得焦点!",Toast.LENGTH_LONG).show(); 57. } 58. } 59. } 2、最终效果如下: (获取焦点) (单击清除文本) 第5章、 OnLongClickListener长按事件 在Android App应用中,OnLongClick事件表示长按2秒以上触发的事件,本章我们通过长按图像设置为墙纸来理解其具体用法。 知识点:OnLongClickListener OnLongClickListener接口与之前介绍的OnClickListener接口原理基本相同,只是该接口为View长按事件的捕捉接口,即当长时间按下某个View时触发的事件,该接口对应的回调方法签名如下。 public boolean onLongClick(View v) 参数v:参数v为事件源控件,当长时间按下此控件时才会触发该方法。 返回值:该方法的返回值为一个boolean类型的变量,当返回true时,表示已经完整地处理了这个事件,并不希望其他的回调方法再次进行处理;当返回false时,表示并没有完全处理完该事件,更希望其他方法继续对其进行处理。 一、设计界面 1、首先把a.jpg、b.jpg、c.jpg、d.jpg、e.jpg、prov.png、next.png图片复制到res/drawable-hdpi文件夹内。 2、打开“res/layout/activity_main.xml”文件,生成ImageButton按钮。 (1)从工具栏向activity拖出1个图像ImageView、2个图像按钮ImageButton。该控件来自Image&Media。 3、打开activity_main.xml文件。 我们把自动生成的代码修改成如下代码,具体为: (1)ImageView的id修改为picture; (2)“上一幅”按钮ImageButton的id修改为prov; (3)设置android:padding="0dp",按钮灰色边框去掉。 (4)“下一幅”按钮ImageButton的id修改为next; (5)设置android:padding="0dp",按钮灰色边框去掉。 代码如下: TextCopy to clipboardPrint 1. 2. xmlns:android="http://schemas.android.com/apk/res/android" 3. xmlns:tools="http://schemas.android.com/tools" 4. android:layout_width="match_parent" 5. android:layout_height="match_parent" 6. tools:context=".MainActivity" > 7. 8. 9. android:id="@+id/picture" 10. android:layout_width="wrap_content" 11. android:layout_height="wrap_content" 12. android:layout_alignParentTop="true" 13. android:layout_centerHorizontal="true" 14. android:layout_marginTop="18dp" 15. android:src="@drawable/a" 16. tools:ignore="ContentDescription" /> 17. 18. 19. android:id="@+id/prov" 20. android:layout_width="wrap_content" 21. android:layout_height="wrap_content" 22. android:layout_alignParentLeft="true" 23. android:layout_below="@+id/picture" 24. android:layout_marginLeft="38dp" 25. android:layout_marginTop="16dp" 26. android:padding="0dp" 27. android:src="@drawable/prov" /> 28. 29. 30. android:id="@+id/next" 31. android:layout_width="wrap_content" 32. android:layout_height="wrap_content" 33. android:layout_alignParentRight="true" 34. android:layout_alignTop="@+id/prov" 35. android:layout_marginRight="24dp" 36. android:padding="0dp" 37. android:src="@drawable/next" /> 38. 39. 4、界面如下: 二、长按事件 打开“src/com.genwoxue.onlongclick/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.example.onlongclick; 2. 3. import android.os.Bundle; 4. import android.app.Activity; 5. import android.widget.ImageButton; 6. import android.widget.ImageView; 7. import android.view.View; 8. import android.view.View.OnClickListener; 9. import android.view.View.OnLongClickListener; 10. import android.widget.Toast; 11. import android.graphics.Bitmap; 12. 13. public class MainActivity extends Activity { 14. //声明Image对象与ImageBoutton对象 15. private ImageView ivwPicture=null; 16. private ImageButton ibtnProv=null; 17. private ImageButton ibtnNext=null; 18. //声明5个图像 19. private Integer[] iImages = {R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d,R.drawable.e}; 20. 21. @Override 22. protected void onCreate(Bundle savedInstanceState) { 23. super.onCreate(savedInstanceState); 24. setContentView(R.layout.activity_main); 25. //获取ImageView对象ivwPicture 26. ivwPicture=(ImageView)super.findViewById(R.id.picture); 27. //获取两个按钮对象ImageButton 28. ibtnProv=(ImageButton)super.findViewById(R.id.prov); 29. ibtnNext=(ImageButton)super.findViewById(R.id.next); 30. //注册OnClick监听器 31. ibtnProv.setOnClickListener(new ProvOnClickListener()); 32. ibtnNext.setOnClickListener(new NextOnClickListener()); 33. //注册OnlongClick监听器 34. ivwPicture.setOnLongClickListener(new PicOnLongClick()); 35. } 36. //单击“上一幅”按钮显示前一张图片 37. private class ProvOnClickListener implements OnClickListener{ 38. private int i=5; 39. public void onClick(View view){ 40. if(i > 0){ 41. ivwPicture.setImageResource(iImages[--i]); 42. } 43. else if(i == 0){ 44. i =5; 45. ivwPicture.setImageResource(iImages[4]); 46. } 47. } 48. } 49. //单击“下一幅”按钮显示后一张图片 50. private class NextOnClickListener implements OnClickListener{ 51. private int i=0; 52. public void onClick(View view){ 53. if(i < 5) 54. ivwPicture.setImageResource(iImages[i++]); 55. else if(i == 5){ 56. i = 0; 57. ivwPicture.setImageResource(iImages[0]); 58. } 59. } 60. } 61. //长按图片设置为桌面墙纸 62. private class PicOnLongClick implements OnLongClickListener{ 63. @Override 64. public boolean onLongClick(View view){ 65. try{ 66. //清空当前墙纸 67. MainActivity.this.clearWallpaper(); 68. //当前view转换为ImageView对象 69. ImageView iv=(ImageView)view; 70. //启用图形缓冲 71. iv.setDrawingCacheEnabled(true); 72. //使用当前缓冲图形创建Bitmap 73. Bitmap bmp=Bitmap.createBitmap(iv.getDrawingCache()); 74. //当前图形设置为墙纸 75. MainActivity.this.setWallpaper(bmp); 76. //清理图形缓冲 77. iv.setDrawingCacheEnabled(false); 78. Toast.makeText(getApplicationContext(), "背景设置成功!",Toast.LENGTH_LONG).show(); 79. } 80. catch(Exception e){ 81. Toast.makeText(getApplicationContext(), "背景设置失败!",Toast.LENGTH_LONG).show(); 82. } 83. return true; 84. } 85. } 86. } 通过“上一幅”、“下一幅”按钮浏览图片,长按图片可以把当前图片设置为桌面墙纸。 三、AndroidManifest.xml文件 打开AndroidManifest.xml文件,添加: 完整代码如下: TextCopy to clipboardPrint 1. 2. 3. package="com.example.onlongclick" 4. android:versionCode="1" 5. android:versionName="1.0" > 6. 7. 8. android:minSdkVersion="8" 9. android:targetSdkVersion="15" /> 10. 11. 12. 13. android:allowBackup="true" 14. android:icon="@drawable/ic_launcher" 15. android:label="@string/app_name" 16. android:theme="@style/AppTheme" > 17. 18. android:name="com.example.onlongclick.MainActivity" 19. android:label="@string/app_name" > 20. 21. 22. 23. 24. 25. 26. 27. 28. 效果如下: 第6章、 OnTouchListener触摸事件 在Android App应用中,OnTouch事件表示触摸事件,本章我们通过滑过图像获取当前位置理解其具体用法。 知识点:OnTouch 一、设计界面 1、首先把c.jpg图片复制到res/drawable-hdpi文件夹内。 2、打开“res/layout/activity_main.xml”文件。 (1)从工具栏向activity拖出1个图像ImageView、1个文本标签TextView。 3、打开activity_main.xml文件。 代码如下: TextCopy to clipboardPrint 1. 2. xmlns:android="http://schemas.android.com/apk/res/android" 3. android:layout_width="match_parent" 4. android:layout_height="match_parent" > 5. 6. 7. android:id="@+id/picture" 8. android:layout_width="wrap_content" 9. android:layout_height="wrap_content" 10. android:layout_alignParentLeft="true" 11. android:layout_alignParentTop="true" 12. android:src="@drawable/c" /> 13. 14. 15. android:id="@+id/info" 16. android:layout_width="wrap_content" 17. android:layout_height="wrap_content" 18. android:layout_alignParentLeft="true" 19. android:layout_below="@+id/picture" 20. android:text="坐标信息" /> 21. 22. 4、界面如下: 二、长按事件 打开“src/com.genwoxue.onlongclick/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.ontouch; 2. 3. import android.os.Bundle; 4. import android.app.Activity; 5. import android.widget.ImageView; 6. import android.widget.TextView; 7. import android.view.View; 8. import android.view.MotionEvent; 9. import android.view.View.OnTouchListener; 10. 11. public class MainActivity extends Activity { 12. //声明TextView、ImageView对象 13. private TextView tvInfo=null; 14. private ImageView ivwPicture=null; 15. 16. @Override 17. protected void onCreate(Bundle savedInstanceState) { 18. super.onCreate(savedInstanceState); 19. setContentView(R.layout.activity_main); 20. //获取TextView、ImageView对象 21. tvInfo=(TextView)super.findViewById(R.id.info); 22. ivwPicture=(ImageView)super.findViewById(R.id.picture); 23. //注册OnTouch监听器 24. ivwPicture.setOnTouchListener(new PicOnTouchListener()); 25. } 26. //OnTouch监听器 27. private class PicOnTouchListener implements OnTouchListener{ 28. @Override 29. public boolean onTouch(View v, MotionEvent event){ 30. //event.getX获取X坐标;event.getY()获取Y坐标 31. String sInfo="X="+String.valueOf(event.getX())+" Y="+String.valueOf(event.getY()); 32. tvInfo.setText(sInfo); 33. return true; 34. } 35. } 36. } 在图片上不断滑动,则会显示其不同的坐标位置。 效果如下: 第7章、 OnKeyListener键盘事件 可以通过键盘事件对EMAIL进行验证(这是网上最多的例子),也可以加入关键字非法文字的过滤。如果要监听键盘事件,必须知道按下和松开两种不同的操作,在OnKeyEvent可以找到按下松开的键。我们这个案例是输入银行卡号,用大字四个一组分隔回显出来,用于提醒是否输错! 知识点:OnKey 一、设计界面 1、打开“res/layout/activity_main.xml”文件。 (1)从工具栏向activity拖出1个文本编辑框EditText、2个文本标签TextView。 3、打开activity_main.xml文件。 完整代码如下: TextCopy to clipboardPrint 1. 2. xmlns:android="http://schemas.android.com/apk/res/android" 3. android:layout_width="match_parent" 4. android:layout_height="match_parent" 5. android:orientation="vertical"> 6. 7. 8. android:id="@+id/prompt" 9. android:layout_width="wrap_content" 10. android:layout_height="wrap_content" 11. android:text="银行账号:" /> 12. 13. 14. android:id="@+id/accout" 15. android:layout_width="wrap_content" 16. android:layout_height="wrap_content" 17. android:ems="10" /> 18. 19. 20. android:id="@+id/info" 21. android:layout_width="wrap_content" 22. android:layout_height="wrap_content" 23. android:textSize="25sp" 24. android:text="" /> 25. 26. 3、界面如下 二、OnKey键盘事件 1、打开“src/com.genwoxue.onkey/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.onkey; 2. 3. import android.os.Bundle; 4. import android.app.Activity; 5. import android.view.KeyEvent; 6. import android.view.View; 7. import android.widget.TextView; 8. import android.widget.EditText; 9. import android.view.View.OnKeyListener; 10. 11. 12. public class MainActivity extends Activity { 13. private EditText etAccout=null; 14. private TextView tvInfo=null; 15. @Override 16. protected void onCreate(Bundle savedInstanceState) { 17. super.onCreate(savedInstanceState); 18. setContentView(R.layout.activity_main); 19. tvInfo=(TextView)super.findViewById(R.id.info); 20. 21. etAccout=(EditText)super.findViewById(R.id.accout); 22. etAccout.setOnKeyListener(new EmailOnKeyListener()); 23. } 24. 25. private class EmailOnKeyListener implements OnKeyListener{ 26. @Override 27. public boolean onKey(View v, int keyCode, KeyEvent event) { 28. //输入银行账号,用大字回显出来字符,每4个字符用横线隔开 29. switch (event.getAction()) { 30. case KeyEvent.ACTION_UP: //键盘松开 31. String sAccout=etAccout.getText().toString(); 32. tvInfo.setText(Subs(sAccout)); 33. case KeyEvent.ACTION_DOWN: //键盘按下 34. break; 35. } 36. return false; 37. } 38. 39. private String Subs(String total){ 40. String news = ""; 41. for(int i=0;i<=total.length()/4;i++) 42. //分段后最后不加中间横线- 43. if(i*4+4 44. news=news+total.substring(i*4,Math.min(i*4+4,total.length()))+"-"; 45. else 46. news=news+total.substring(i*4,Math.min(i*4+4,total.length())); 47. return news; 48. } 49. } 50. 51. } 在Android App中,键盘事件主要用于对键盘事件的监听,根据用户输入内容对键盘事件进行跟踪,键盘事件使用View.OnKeyListener接口进行事件处理,接口定义如下 public static interface View.OnKeyListener{ public boolean OnKey(View v,int keyCode,KeyEvent event); } 2、输入银行账号,自动回显字符。 效果如下: 第五篇:再识Android基础控件 第1章、 流动视图ScrollView 滚动视图的使用形式与各个布局管理器的操作形式类似,唯一不同的是,所有的布局管理器之中,可以包含多个组件,而滚动视图里只能有一个组件,所以所谓的视图指的就是提供一个专门的容器,这个容器里面可以装下多于屏幕宽度的组件,而后采用拖拽的方式显示所有 ScrollView 中的组件。 我们这个案例是显示常用网址! 知识点:ScrollView控件 一、设计界面 1、打开“res/layout/activity_main.xml”文件。 手工输入以下代码:切记XML文件ScrollView中只能放一个其他控件,如果想加入更多,只能通过java代码形式。 TextCopy to clipboardPrint 1. 2. 3. 4. xmlns:android="http://schemas.android.com/apk/res/android" 5. android:id="@+id/scroll" 6. android:layout_width="match_parent" 7. android:layout_height="match_parent"> 8. 9. 10. xmlns:android="http://schemas.android.com/apk/res/android" 11. android:orientation="vertical" 12. android:id="@+id/linear" 13. android:layout_width="match_parent" 14. android:layout_height="wrap_content" /> 15. 16. 二、ScrollView流动视图代码 1、打开“src/com.genwoxue.scrollview/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.scrollview; 2. 3. import android.app.Activity; 4. import android.os.Bundle; 5. import android.view.ViewGroup; 6. import android.widget.Button; 7. import android.widget.LinearLayout; 8. 9. public class MainActivity extends Activity { 10. 11. private String webaddress[] = { "网易:www.163.com", "新浪:www.sina.com.cn", "搜狐:www.sohu.com", 12. "腾讯:www.qq.com", "百度:www.baidu.com", "东方财富:www.eastmoney.com", 13. "金融界:www.jrj.com.cn", "奇艺:www.iqiyi.com", "携程网:www.ctrip.com","中国移动:www.10086.cn", 14. "美食中国:www.meishichina.com","工商银行:www.icbc.com.cn","CSDN:www.csdn.net","跟我学:www.genwoxue.com" }; 15. 16. @Override 17. public void onCreate(Bundle savedInstanceState) { 18. super.onCreate(savedInstanceState); 19. setContentView(R.layout.activity_main); 20. 21. //获取LinearLayout布局 22. LinearLayout layout = (LinearLayout) super.findViewById(R.id.linear); 23. 24. // 定义布局参数 25. LinearLayout.LayoutParams param = new LinearLayout.LayoutParams( 26. ViewGroup.LayoutParams.MATCH_PARENT, 27. ViewGroup.LayoutParams.WRAP_CONTENT); 28. 29. for (int i = 0; i < this.webaddress.length; i++) { 30. Button btnWebAddress = new Button(this); 31. btnWebAddress.setText(this.webaddress[i]); // 设置显示文字 32. layout.addView(btnWebAddress, param); // 增加组件 33. } 34. } 35. } ScrollView继承自FrameLayout,所以ScrollView控件本质就是一个布局管理器。 2、效果如下: 第2章、 列表视图ListView之一 在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。 一、简单应用 1、打开“res/layout/activity_main.xml”文件。 (1)从工具栏向activity拖出1个列表视图ListView。 (2)打开activity_main.xml文件。 完整代码如下: TextCopy to clipboardPrint 1. 2. 3. xmlns:android="http://schemas.android.com/apk/res/android" 4. android:layout_width="match_parent" 5. android:layout_height="match_parent"> 6. 7. 8. android:id="@+id/news" 9. android:layout_width="match_parent" 10. android:layout_height="wrap_content" 11. android:layout_alignParentLeft="true" 12. android:layout_alignParentTop="true" > 13. 14. 15. 2、ListView列表视图代码 (1)打开“src/com.genwoxue.listview/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.example.listview_a; 2. 3. import android.app.Activity; 4. import android.os.Bundle; 5. import android.widget.ListView; 6. import android.widget.ArrayAdapter; 7. 8. public class MainActivity extends Activity { 9. private ListView lvNews=null; 10. private String news[] = { "互联网产品中的情感化设计", "有效导向社交产品的商业价值", "移动开发者:得90后者得天下", 11. "用户体验:从App的加载页面说开去", "用扁平化的界面设计吸引用户", "实体与数字世界的交集", 12. "网络社区用户成长的5个思考模式", "十大值得关注的传统企业电商", "2013年十大热点技术发展趋势","了解产品的开发环节:环形设计论", 13. "客户忠诚度的四个层次","在手机背面贴张'纸'就能轻松充电","互联网公司是怎样激发你的消费欲望的","高效工作的信息搜集及管理术" }; 14. 15. @Override 16. public void onCreate(Bundle savedInstanceState) { 17. super.onCreate(savedInstanceState); 18. setContentView(R.layout.activity_main); 19. lvNews=(ListView)super.findViewById(R.id.news); 20. lvNews.setAdapter(new ArrayAdapter(this,android.R.layout.simple_list_item_1,news)); 21. } 22. } 上面代码使用了ArrayAdapter(Context context, int textViewResourceId, List objects)来装配数据,要装配这些数据就需要一个连接ListView视图对象和数组数据的适配器来两者的适配工作,ArrayAdapter的构造需要三个参数,依次为this,布局文件(注意这里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字,数据源(一个List集合)。同时用setAdapter()完成适配的最后工作。 (2)运行结果: 第3章、 列表视图ListView之二 在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。 在上一章,我们采用ArrayAdapter填充ListView,本章我们了解一下SimpleAdapter的应用。 一、SimpleAdapter应用 1、打开“res/layout/activity_main.xml”文件。 完整代码如下: TextCopy to clipboardPrint 1. 2. 3. 4. xmlns:android="http://schemas.android.com/apk/res/android" 5. android:orientation="horizontal" 6. android:layout_width="match_parent" 7. android:layout_height="match_parent"> 8. 9. 10. android:layout_width="wrap_content" 11. android:layout_height="wrap_content" 12. android:layout_margin="5dip"/> 13. 14. 15. android:layout_width="wrap_content" 16. android:layout_height="wrap_content"> 17. 18. 19. android:layout_width="wrap_content" 20. android:layout_height="wrap_content" 21. android:textColor="#16CCDD" 22. android:textSize="22sp" /> 23. 24. 25. android:layout_width="wrap_content" 26. android:layout_height="wrap_content" 27. android:textColor="#666666" 28. android:textSize="16sp" /> 29. 30. 31. 2、ListView代码 (1)打开“src/com.genwoxue.listview_b/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.listview_b; 2. 3. import java.util.ArrayList; 4. import java.util.HashMap; 5. import java.util.List; 6. import java.util.Map; 7. import android.app.ListActivity; 8. import android.os.Bundle; 9. import android.widget.SimpleAdapter; 10. 11. //ListActivity本质仍然是一个Activity,只不过对于ListVivew更方便 12. public class MainActivity extends ListActivity { 13. @Override 14. public void onCreate(Bundle savedInstanceState) { 15. super.onCreate(savedInstanceState); 16. //注意SimpleAdapter适配器用法 17. SimpleAdapter adapter = new SimpleAdapter(this,getData(), 18. R.layout.activity_main, 19. new String[]{"title","info","picture"}, 20. new int[]{R.id.title,R.id.info,R.id.picture}); 21. setListAdapter(adapter); 22. 23. } 24. 25. private List> getData() { 26. List> list = new ArrayList>(); 27. Map map = new HashMap(); 28. map.put("title", "图片"); 29. map.put("info", "美辰良景,给你无限的遐思,让人感觉无限温馨……"); 30. map.put("picture", R.drawable.photo); 31. list.add(map); 32. 33. map = new HashMap(); 34. map.put("title", "音乐"); 35. map.put("info", "轻曼音乐,令人如入仙境,如痴如醉……"); 36. map.put("picture", R.drawable.music); 37. list.add(map); 38. 39. map = new HashMap(); 40. map.put("title", "视频"); 41. map.put("info", "震撼场景,360度的视觉捕获,一览无遗……"); 42. map.put("picture", R.drawable.video); 43. list.add(map); 44. 45. return list; 46. } 47. } ListView列表视图的显示需要三个元素: A.ListVeiw 用来展示列表的View。 B.适配器 用来把数据映射到ListView上的中介。 C.数据 具体的将被映射的字符串,图片,或者基本组件。 simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,ListActivity和普通的Activity没有太大的差别,不同就是对显示ListView做了许多优化,方面显示而已。 (2)运行结果: 第4章、 常见对话框之一AlertDialog 在Android应用中,有多种对话框:Dialog、AlertDialog、ProgressDialog、时间、日期等对话框。 (1)Dialog类,是一切对话框的基类,需要注意的是,Dialog类虽然可以在界面上显示,但是并非继承与习惯的View类,而是直接从java.lang.Object开始构造出来的,类似于Activity,Dialog也是有生命周期的,它的生命周期由Activity来维护。Activity负责生产,保存,回复它,在生命周期的每个阶段都有一些回调函数供系统方向调用。 (2)AlertDialog是Dialog的一个直接子类,AlertDialog也是Android系统当中最常用的对话框之一。一个AlertDialog可以有两个Button或3个Button,可以对一个AlertDialog设置title和message.不能直接通过AlertDialog的构造函数来生成一个AlertDialog.一般生成AlertDialog的时候都是通过它的一个内部静态类AlertDialog.builder来构造的。 (3)顾名思义,这个Dialog负责给用户显示进度的相关情况,它是AlertDialog的一个子类。 本章我们着重讲解一下AlertDialog! AlertDialog的构造方法全部是Protected的,所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法。 使用AlertDialog.Builder创建对话框需要了解以下几个方法: setTitle :为对话框设置标题 setIcon :为对话框设置图标 setMessage:为对话框设置内容 setView : 给对话框设置自定义样式 setItems :设置对话框要显示的一个list,一般用于显示几个命令时 setMultiChoiceItems :用来设置对话框显示一系列的复选框 setNeutralButton :普通按钮 setPositiveButton :给对话框添加"Yes"按钮 setNegativeButton :对话框添加"No"按钮 create : 创建对话框 show :显示对话框 一、简单对话框 Dialog类虽然可以在界面上显示,但是并非继承与习惯的View类,而是直接从java.lang.Object开始构造出来的。 1、打开“src/com.genwoxue.alertdialog_a/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.example.alertdialog_a; 2. 3. import android.os.Bundle; 4. import android.app.Activity; 5. import android.app.AlertDialog.Builder; 6. import android.app.AlertDialog; 7. 8. public class MainActivity extends Activity { 9. 10. @Override 11. protected void onCreate(Bundle savedInstanceState) { 12. super.onCreate(savedInstanceState); 13. setContentView(R.layout.activity_main); 14. //AlertDialog的构造方法全部是Protected的,所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 15. //要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法 16. Builder adInfo=new AlertDialog.Builder(this); 17. adInfo.setTitle("简单对话框"); //设置标题 18. adInfo.setMessage("这是一个美丽的传说,精美的石头会唱歌……"); //设置内容 19. adInfo.setIcon(R.drawable.ic_launcher); //设置图标 20. adInfo.create(); 21. adInfo.show(); 22. 23. } 24. } 2、运行,显示界面: 二、带按钮的AlertDialog 我们在执行删除、确认等操作时,常常在对话框中单击按钮,AlertDialog可以显示3个按钮。 1、打开“src/com.genwoxue.alertdialog_bMainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.example.alertdialog_b; 2. 3. import android.os.Bundle; 4. import android.app.Activity; 5. import android.app.AlertDialog.Builder; 6. import android.app.AlertDialog; 7. import android.content.DialogInterface; 8. 9. public class MainActivity extends Activity { 10. 11. @Override 12. protected void onCreate(Bundle savedInstanceState) { 13. super.onCreate(savedInstanceState); 14. setContentView(R.layout.activity_main); 15. 16. Builder dialog = new AlertDialog.Builder(this); 17. dialog.setTitle("确定删除?"); 18. dialog.setMessage("您确定删除该条信息吗?"); 19. dialog.setIcon(R.drawable.ic_launcher); 20. //为“确定”按钮注册监听事件 21. dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { 22. @Override 23. public void onClick(DialogInterface dialog, int which) { 24. // 根据实际情况编写相应代码。 25. } 26. }); 27. //为“取消”按钮注册监听事件 28. dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() { 29. @Override 30. public void onClick(DialogInterface dialog, int which) { 31. // 根据实际情况编写相应代码。 32. } 33. }); 34. //为“查看详情”按钮注册监听事件 35. dialog.setNeutralButton("查看详情", new DialogInterface.OnClickListener() { 36. @Override 37. public void onClick(DialogInterface dialog, int which) { 38. // 根据实际情况编写相应代码。 39. } 40. }); 41. dialog.create(); 42. dialog.show(); 43. } 44. } 2、运行,显示界面: 三、带有单选按钮、类似ListView的AlertDialog对话框 setSingleChoiceItems(CharSequence[] items, int checkedItem,final OnClickListener listener)方法来实现类似ListView的AlertDialog,第一个参数是要显示的数据的数组,第二个参数指定默认选中项,第三个参数设置监听处理事件。 1、打开“src/com.genwoxue.alertdialog_c/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.alertdialog_c; 2. 3. import android.app.Activity; 4. import android.app.AlertDialog; 5. import android.app.Dialog; 6. import android.content.DialogInterface; 7. import android.os.Bundle; 8. import android.widget.Toast; 9. 10. public class MainActivity extends Activity { 11. //声明选中项变量 12. private int selectedCityIndex = 0; 13. 14. @Override 15. public void onCreate(Bundle savedInstanceState) { 16. super.onCreate(savedInstanceState); 17. setContentView(R.layout.activity_main); 18. //定义城市数组 19. final String[] arrayCity = new String[] { "杭州", "纽约", "威尼斯", "北海道" }; 20. 21. //实例化AlertDialog对话框 22. Dialog alertDialog = new AlertDialog.Builder(this) 23. .setTitle("你最喜欢哪个地方?") //设置标题 24. .setIcon(R.drawable.ic_launcher) //设置图标 25. //设置对话框显示一个单选List,指定默认选中项,同时设置监听事件处理 26. .setSingleChoiceItems(arrayCity, 0, new DialogInterface.OnClickListener() { 27. 28. @Override 29. public void onClick(DialogInterface dialog, int which) { 30. selectedCityIndex = which; //选中项的索引保存到选中项变量 31. } 32. }) 33. //添加取消按钮并增加监听处理 34. .setNegativeButton("取消", new DialogInterface.OnClickListener() { 35. @Override 36. public void onClick(DialogInterface dialog, int which) { 37. // TODO Auto-generated method stub 38. } 39. }) 40. //添加确定按钮并增加监听处理 41. .setPositiveButton("确认", new DialogInterface.OnClickListener() { 42. @Override 43. public void onClick(DialogInterface dialog, int which) { 44. Toast.makeText(getApplication(), arrayCity[selectedCityIndex], Toast.LENGTH_SHORT).show(); 45. } 46. }) 47. .create(); 48. alertDialog.show(); 49. } 50. } 2、运行,显示界面: 四、带有复选框、类似ListView的AlertDialog对话框 setMultiChoiceItems(CharSequence[] items, boolearn[] checkedItems,final OnMultiChoiceClickListener listener)方法来实现类似ListView的AlertDialog,第一个参数是要显示的数据的数组,第二个参数指定默认选中项,第在个参数设置监听处理事件。 1、打开“src/com.genwoxue.alertdialog_d/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.alertdialog_d; 2. 3. import android.app.Activity; 4. import android.app.AlertDialog; 5. import android.app.Dialog; 6. import android.content.DialogInterface; 7. import android.os.Bundle; 8. import android.widget.Toast; 9. 10. 11. public class MainActivity extends Activity { 12. 13. @Override 14. public void onCreate(Bundle savedInstanceState) { 15. super.onCreate(savedInstanceState); 16. setContentView(R.layout.activity_main); 17. //定义运动数组 18. final String[] arraySport = new String[] { "足球", "篮球", "网球", "乒乓球" }; 19. final boolean[] arraySportSelected = new boolean[] {false, false, false, false}; 20. 21. //实例化AlertDialog对话框 22. Dialog alertDialog = new AlertDialog.Builder(this) 23. .setTitle("你喜欢哪些运动?") //设置标题 24. .setIcon(R.drawable.ic_launcher) //设置图标 25. //设置对话框显示一个复选List,指定默认选中项,同时设置监听事件处理 26. .setMultiChoiceItems(arraySport, arraySportSelected, new DialogInterface.OnMultiChoiceClickListener() { 27. 28. @Override 29. public void onClick(DialogInterface dialog, int which, boolean isChecked) { 30. arraySportSelected[which] = isChecked; //选中项的布尔真假保存到选中项变量 31. } 32. }) 33. //添加取消按钮并增加监听处理 34. .setPositiveButton("确认", new DialogInterface.OnClickListener() { 35. 36. @Override 37. public void onClick(DialogInterface dialog, int which) { 38. StringBuilder stringBuilder = new StringBuilder(); 39. for (int i = 0; i < arraySportSelected.length; i++) { 40. if (arraySportSelected[i] == true){ 41. stringBuilder.append(arraySport[i] + "、"); 42. } 43. } 44. Toast.makeText(getApplication(), stringBuilder.toString(), Toast.LENGTH_SHORT).show(); 45. } 46. }) 47. 48. //添加确定按钮并增加监听处理 49. .setNegativeButton("取消", new DialogInterface.OnClickListener() { 50. 51. @Override 52. public void onClick(DialogInterface dialog, int which) { 53. // TODO Auto-generated method stub 54. } 55. }) 56. .create(); 57. 58. alertDialog.show(); 59. } 60. } 2、运行,显示界面: 第5章、 自定义警告框AlertDialog 尽管系统默认的Dialog已经能够基本上满足我们大多数情况,但由于系统默认对话框样式是固定、统一的,而我们实际开发过程中,往往根据应用不同,可能会有不同的布局或者配色,那么就需要我们自定义对话框了。 如何自定义一个对话框呢? (1)修改系统默认的Dialog样式(风格、主题) (2)自定义Dialog布局文件 (3)可以自己封装一个类,继承自Dialog或者直接使用Dialog类来实现,为了方便以后重复使用,建议自己封装一个Dialog类。 第6章、 日期对话框DatePickerDialog 在Android应用中,设置日期和时间是非常简单的事,由日期和时间对话框控件搞定。 一、界面 1、打开“src/com.genwoxue.datetimediy/active_main.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. 2. 3. android:id="@+id/LinearLayout01" 4. android:layout_width="fill_parent" 5. android:layout_height="fill_parent" 6. android:orientation="vertical" 7. xmlns:android="http://schemas.android.com/apk/res/android"> 8. 9. android:id="@+id/et" 10. android:layout_width="fill_parent" 11. android:layout_height="wrap_content" 12. android:editable="false" 13. android:cursorVisible="false" /> 14. 15. 16. android:text="日期对话框" 17. android:id="@+id/dateBtn" 18. android:layout_width="fill_parent" 19. android:layout_height="wrap_content" /> 20. 21. 22. android:text="时间对话框" 23. android:id="@+id/timeBtn" 24. android:layout_width="fill_parent" 25. android:layout_height="wrap_content" /> 26. 27. 28. android:text="@+id/digitalClock" 29. android:textSize="20dip" 30. android:gravity="center" 31. android:id="@+id/DigitalClock01" 32. android:layout_width="fill_parent" 33. android:layout_height="wrap_content" /> 34. 35. 36. android:id="@+id/analogClock" 37. android:gravity="center" 38. android:layout_width="fill_parent" 39. android:layout_height="wrap_content" /> 40. 41. 42. 2、打开“src/com.genwoxue.datetimediy/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.datetimedialog; 2. 3. import java.util.Calendar; 4. import android.app.Activity; 5. import android.app.DatePickerDialog; 6. import android.app.Dialog; 7. import android.app.TimePickerDialog; 8. import android.os.Bundle; 9. import android.view.View; 10. import android.widget.Button; 11. import android.widget.DatePicker; 12. import android.widget.EditText; 13. import android.widget.TimePicker; 14. 15. public class MainActivity extends Activity { 16. 17. private Button dateBtn = null; 18. private Button timeBtn = null; 19. private EditText et=null; 20. private final static int DATE_DIALOG = 0; 21. private final static int TIME_DIALOG = 1; 22. private Calendar c = null; 23. 24. @Override 25. public void onCreate(Bundle savedInstanceState) { 26. super.onCreate(savedInstanceState); 27. setContentView(R.layout.activity_main); 28. et=(EditText)findViewById(R.id.et); 29. dateBtn = (Button) findViewById(R.id.dateBtn); 30. timeBtn = (Button) findViewById(R.id.timeBtn); 31. dateBtn.setOnClickListener(new View.OnClickListener(){ 32. public void onClick(View v) { 33. showDialog(DATE_DIALOG); 34. } 35. }); 36. 37. timeBtn.setOnClickListener(new View.OnClickListener(){ 38. public void onClick(View v) { 39. showDialog(TIME_DIALOG); 40. } 41. }); 42. } /** * 创建日期及时间选择对话框 */ 43. 44. @Override 45. protected Dialog onCreateDialog(int id) { 46. Dialog dialog = null; 47. switch (id) { 48. case DATE_DIALOG: 49. c = Calendar.getInstance(); 50. dialog = new DatePickerDialog(this,new DatePickerDialog.OnDateSetListener() { 51. public void onDateSet(DatePicker dp, int year,int month, int dayOfMonth) { 52. et.setText("您选择了:" + year + "年" + (month+1) + "月" + dayOfMonth + "日"); 53. } 54. }, c.get(Calendar.YEAR), // 传入年份 55. c.get(Calendar.MONTH), // 传入月份 56. c.get(Calendar.DAY_OF_MONTH) // 传入天数 57. ); 58. break; 59. case TIME_DIALOG: 60. c=Calendar.getInstance(); 61. dialog=new TimePickerDialog(this,new TimePickerDialog.OnTimeSetListener(){ 62. public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 63. et.setText("您选择了:"+hourOfDay+"时"+minute+"分"); 64. } 65. }, 66. c.get(Calendar.HOUR_OF_DAY), 67. c.get(Calendar.MINUTE), 68. false 69. ); 70. break; 71. } 72. return dialog; 73. } 74. } 2、运行,显示界面: 第7章、 进度条对话框ProgressDialog 进度条对话框ProgressDialog经常用于不能马上完成的操作,为了避免用户莫名其妙的等待,给用户一个提示。 本例中我们演示了两种进度条:条形进度条和圆形进度条。 一、设计界面 1、打开“res/layout/activity_main.xml”文件。 从工具栏向activity拖出2个按钮Button。 2、打开activity_main.xml文件。 代码如下: TextCopy to clipboardPrint 1. 2. 3. xmlns:android="http://schemas.android.com/apk/res/android" 4. android:layout_width="match_parent" 5. android:layout_height="match_parent" 6. android:orientation="vertical" > 7. 8. 9. android:id="@+id/progress" 10. android:layout_width="wrap_content" 11. android:layout_height="wrap_content" 12. android:text="条形进度条" /> 13. 14. 15. android:id="@+id/circle" 16. android:layout_width="wrap_content" 17. android:layout_height="wrap_content" 18. android:text="圆形进度条" /> 19. 20. 二、长按事件 打开“src/com.genwoxue.progress/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.progress; 2. 3. import android.app.Activity; 4. import android.app.ProgressDialog; 5. import android.content.DialogInterface; 6. import android.os.Bundle; 7. import android.view.View; 8. import android.widget.Button; 9. 10. public class MainActivity extends Activity 11. 12. { 13. //声明按钮 14. private Button btnCircle=null; 15. private Button btnProgress=null; 16. //声明进度条对话框 17. private ProgressDialog pdDialog=null; 18. //进度计数 19. int iCount = 0; 20. 21. @Override 22. public void onCreate(Bundle savedInstanceState) 23. 24. { 25. 26. super.onCreate(savedInstanceState); 27. setContentView(R.layout.activity_main); 28. 29. //获取按钮对象 30. btnCircle = (Button)findViewById(R.id.circle); 31. btnProgress = (Button)findViewById(R.id.progress); 32. 33. //设置btnCircle的事件监听 34. btnCircle.setOnClickListener(new Button.OnClickListener() { 35. 36. @Override 37. public void onClick(View v){ 38. 39. iCount = 0; 40. //创建ProgressDialog对象 41. pdDialog = new ProgressDialog(MainActivity.this); 42. 43. //设置进度条风格,风格为圆形,旋转的 44. pdDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 45. 46. // 设置ProgressDialog 标题 47. pdDialog.setTitle("圆形进度条"); 48. 49. // 设置ProgressDialog 提示信息 50. pdDialog.setMessage("正在下载中……"); 51. 52. // 设置ProgressDialog 标题图标 53. pdDialog.setIcon(R.drawable.ic_launcher); 54. 55. // 设置ProgressDialog 进度条进度 56. pdDialog.setProgress(100); 57. 58. // 设置ProgressDialog 的进度条是否不明确 59. pdDialog.setIndeterminate(false); 60. 61. // 设置ProgressDialog 是否可以按退回按键取消 62. pdDialog.setCancelable(true); 63. 64. // 设置ProgressDialog 的一个Button 65. pdDialog.setButton("取消", new DialogInterface.OnClickListener() { 66. public void onClick(DialogInterface dialog, int i) 67. { 68. //点击“取消”按钮取消对话框 69. dialog.cancel(); 70. } 71. }); 72. 73. // 让ProgressDialog显示 74. pdDialog.show(); 75. 76. //创建线程实例 77. new Thread(){ 78. public void run(){ 79. try{ 80. while (iCount <= 100) { 81. // 由线程来控制进度。 82. pdDialog.setProgress(iCount ++); 83. Thread.sleep(50); 84. } 85. pdDialog.cancel(); 86. } 87. catch (InterruptedException e){ 88. pdDialog.cancel(); 89. } 90. } 91. 92. }.start(); 93. } 94. 95. }); 96. 97. 98. 99. //设置btnProgress的事件监听 100. btnProgress.setOnClickListener(new Button.OnClickListener() { 101. @Override 102. public void onClick(View v) 103. { 104. iCount = 0; 105. // 创建ProgressDialog对象 106. pdDialog = new ProgressDialog(MainActivity.this); 107. 108. // 设置进度条风格,风格为长形 109. pdDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 110. 111. // 设置ProgressDialog 标题 112. pdDialog.setTitle("条形进度条"); 113. 114. // 设置ProgressDialog 提示信息 115. pdDialog.setMessage("正在下载中……"); 116. 117. // 设置ProgressDialog 标题图标 118. pdDialog.setIcon(R.drawable.ic_launcher); 119. 120. // 设置ProgressDialog 进度条进度 121. pdDialog.setProgress(100); 122. 123. // 设置ProgressDialog 的进度条是否不明确 124. pdDialog.setIndeterminate(false); 125. 126. // 设置ProgressDialog 是否可以按退回按键取消 127. pdDialog.setCancelable(true); 128. 129. // 让ProgressDialog显示 130. pdDialog.show(); 131. 132. //创建线程实例 133. new Thread(){ 134. public void run(){ 135. try{ 136. while (iCount <= 100) { 137. // 由线程来控制进度。 138. pdDialog.setProgress(iCount ++); 139. Thread.sleep(50); 140. } 141. pdDialog.cancel(); 142. } 143. catch (InterruptedException e){ 144. pdDialog.cancel(); 145. } 146. } 147. 148. }.start(); 149. } 150. }); 151. } 152. } 三、运行效果 第8章、 拖动条SeekBar 听歌、看电影,快进或者退回某一时间或者调节音量大小,我们都会用到SeekBar拖动条,本章一起来了解一下用法。 一、设计界面 1、打开“res/layout/activity_main.xml”文件。 从工具栏向activity拖出1个按钮SeekBar、2个TextView。 2、打开activity_main.xml文件。 代码如下: TextCopy to clipboardPrint 1. 2. 3. 4. android:orientation="vertical" 5. android:layout_width="match_parent" 6. android:layout_height="match_parent"> 7. 8. 9. android:id="@+id/seekbar" 10. android:layout_width="match_parent" 11. android:layout_height="wrap_content" 12. android:max="100" 13. android:progress="50" 14. android:secondaryProgress="75" /> 15. 16. 17. android:id="@+id/info01" 18. android:layout_width="match_parent" 19. android:layout_height="wrap_content" /> 20. 21. 22. android:id="@+id/info02" 23. android:layout_width="match_parent" 24. android:layout_height="wrap_content" /> 25. 26. 二、程序文件 打开“src/com.genwoxue.seekbar/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.seekbar; 2. 3. import android.app.Activity; 4. import android.os.Bundle; 5. import android.widget.SeekBar; 6. import android.widget.TextView; 7. import android.widget.SeekBar.OnSeekBarChangeListener; 8. 9. //注意同时从MainActivity类自Activity继承与实现OnSeekBarChangeListener接口 10. public class MainActivity extends Activity implements OnSeekBarChangeListener 11. { 12. //声明变量 13. private SeekBar sbVolumer=null; 14. private TextView tvinfo01=null; 15. private TextView tvInfo02=null; 16. @Override 17. public void onCreate(Bundle savedInstanceState) 18. { 19. super.onCreate(savedInstanceState); 20. setContentView(R.layout.activity_main); 21. //获得控件 22. sbVolumer = (SeekBar) findViewById(R.id.seekbar); 23. sbVolumer.setOnSeekBarChangeListener(this); 24. tvinfo01 = (TextView) findViewById(R.id.info01); 25. tvInfo02 = (TextView) findViewById(R.id.info02); 26. } 27. 28. //SeekBar数值改变事件 29. @Override 30. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) 31. { 32. tvinfo01.setText("音量当前值:"+progress); 33. } 34. 35. //SeekBar开始拖动事件 36. @Override 37. public void onStartTrackingTouch(SeekBar arg0) 38. { 39. tvInfo02.setText("音量正在调解"); 40. } 41. 42. //SeekBar停止拖动事件 43. @Override 44. public void onStopTrackingTouch(SeekBar arg0) 45. { 46. tvInfo02.setText("音量停止调解"); 47. } 48. } 说明:了解seekbar的常见方法与属性。 (1)拖动条SeekBar的事件 由于拖动条可以被用户控制。所以需要对其进行事件监听,这就需要实现SeekBar.OnSeekBarChangeListener接口。此接口共需要监听三个事件,分别是: 数值改变(onProgressChanged) 开始拖动(onStartTrackingTouch) 停止拖动(onStopTrackingTouch) (2)拖动条的主要属性和方法 setMax 设置拖动条的数值 setProgress 设置拖动条当前的数值 setSeconddaryProgress 设置第二拖动条的数值,即当前拖动条推荐的数值 三、运行效果 第9章、 评分条RatingBar RatingBar是基于SeekBar和ProgressBar的扩展,用星型来显示等级评定。使用RatingBar的默认大小时,用户可以触摸/拖动或使用键来设置评分,它有两种样式(小风格用ratingBarStyleSmall,大风格用ratingBarStyleIndicator),其中大的只适合指示,不适合于用户交互。 主要用于评分。 一、设计界面 1、打开“res/layout/activity_main.xml”文件。 从工具栏向activity拖出1个评分条RatingBar。 2、打开activity_main.xml文件。 代码如下: TextCopy to clipboardPrint 1. 2. 3. 4. xmlns:android="http://schemas.android.com/apk/res/android" 5. android:orientation="vertical" 6. android:layout_width="match_parent" 7. android:layout_height="match_parent"> 8. 9. 10. android:layout_width="wrap_content" 11. android:layout_height="wrap_content" 12. android:id="@+id/ratingbar" /> 13. 14. 二、程序文件 打开“src/com.genwoxue.ratingbar/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.ratingbar; 2. 3. import android.app.Activity; 4. import android.os.Bundle; 5. import android.widget.RatingBar; 6. import android.widget.Toast; 7. 8. public class MainActivity extends Activity { 9. 10. //声明RatingBar 11. private RatingBar rbScore=null; 12. @Override 13. public void onCreate(Bundle savedInstanceState) { 14. super.onCreate(savedInstanceState); 15. setContentView(R.layout.activity_main); 16. 17. //获取RatingBar 18. rbScore = (RatingBar)findViewById(R.id.ratingbar); 19. 20. //设置监听事件 21. rbScore.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener(){ 22. public void onRatingChanged(RatingBar ratingBar, float rating,boolean fromUser) { 23. Toast.makeText(getApplication(), "rating:"+String.valueOf(rating),Toast.LENGTH_SHORT).show(); 24. } 25. }); 26. } 27. } 说明:RatingBar监听事件。 public void setOnRatingBarChangeListener (RatingBar.OnRatingBarChangeListener listener) 设置当评分等级发生改变时回调的监听器 三、运行效果 第10章、 信息提示框Toast Toast用于向用户显示一些帮助或者提示,对于我们来说已经不陌生了,经常用到。 下面我们一起再深入了解一下Toast,你会惊奇发现Toast原来还能这样做! 一、设计界面 1、打开“res/layout/activity_main.xml”文件。 从工具栏向activity拖出5个按钮Button。 2、打开activity_main.xml文件。 代码如下: TextCopy to clipboardPrint 1. 2. 3. 4. xmlns:android="http://schemas.android.com/apk/res/android" 5. android:orientation="vertical" 6. android:layout_width="match_parent" 7. android:layout_height="match_parent" 8. android:padding="5dip" 9. android:gravity="center"> 10. 11. 12. android:layout_width="match_parent" 13. android:id="@+id/original" 14. android:text="默认样式" /> 15. 16. 17. android:layout_width="match_parent" 18. android:id="@+id/byphoto" 19. android:text="带图片样式"/> 20. 21. 22. android:layout_width="match_parent" 23. android:text="自定义显示位置样式" 24. android:id="@+id/customposition"/> 25. 26. 27. android:layout_width="match_parent" 28. android:text="完全自定义样式" 29. android:id="@+id/alldiy"/> 30. 31. 32. android:layout_width="fill_parent" 33. android:text="来自其他线程样式" 34. android:id="@+id/bythread"/> 35. 36. 3、添加custom.xml文件 代码如下: TextCopy to clipboardPrint 1. 2. 3. 4. xmlns:android="http://schemas.android.com/apk/res/android" 5. android:layout_height="wrap_content" 6. android:layout_width="wrap_content" 7. android:background="#ffffffff" 8. android:orientation="vertical" 9. android:id="@+id/customtoast" > 10. 11. 12. android:layout_height="wrap_content" 13. android:layout_margin="1dip" 14. android:textColor="#ffffffff" 15. android:layout_width="match_parent" 16. android:gravity="center" 17. android:background="#16ccdd" 18. android:id="@+id/titletoast" /> 19. 20. 21. android:layout_height="wrap_content" 22. android:orientation="vertical" 23. android:id="@+id/customtoastcontent" 24. android:layout_marginLeft="1dip" 25. android:layout_marginRight="1dip" 26. android:layout_marginBottom="1dip" 27. android:layout_width="wrap_content" 28. android:padding="15dip" 29. android:background="#ccffff" > 30. 31. 32. android:layout_height="wrap_content" 33. android:layout_gravity="center" 34. android:layout_width="wrap_content" 35. android:id="@+id/picture" /> 36. 37. 38. android:layout_height="wrap_content" 39. android:paddingRight="10dip" 40. android:paddingLeft="10dip" 41. android:layout_width="wrap_content" 42. android:gravity="center" 43. android:textColor="#ff000000" 44. android:id="@+id/prompt" /> 45. 46. 二、程序文件 打开“src/com.genwoxue.toast/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.toast; 2. 3. import android.app.Activity; 4. import android.os.Bundle; 5. import android.os.Handler; 6. import android.view.Gravity; 7. import android.view.LayoutInflater; 8. import android.view.View; 9. import android.view.ViewGroup; 10. import android.view.View.OnClickListener; 11. import android.widget.ImageView; 12. import android.widget.LinearLayout; 13. import android.widget.TextView; 14. import android.widget.Toast; 15. import android.widget.Button; 16. 17. public class MainActivity extends Activity implements OnClickListener { 18. 19. Handler handler = new Handler(); 20. //声明按钮 21. private Button btnOriginal=null; 22. private Button btnByPhoto=null; 23. private Button btnCustomPosition=null; 24. private Button btnAllDiy=null; 25. private Button btnThread=null; 26. 27. @Override 28. public void onCreate(Bundle savedInstanceState) { 29. super.onCreate(savedInstanceState); 30. setContentView(R.layout.activity_main); 31. //获得按钮 32. btnOriginal=(Button)super.findViewById(R.id.original); 33. btnByPhoto=(Button)super.findViewById(R.id.byphoto); 34. btnCustomPosition=(Button)super.findViewById(R.id.customposition); 35. btnAllDiy=(Button)super.findViewById(R.id.alldiy); 36. btnThread=(Button)super.findViewById(R.id.bythread); 37. //设置OnClick监听事件 38. btnOriginal.setOnClickListener(this); 39. btnByPhoto.setOnClickListener(this); 40. btnCustomPosition.setOnClickListener(this); 41. btnAllDiy.setOnClickListener(this); 42. btnThread.setOnClickListener(this); 43. } 44. 45. /* 线程 */ 46. public void showToast() { 47. handler.post(new Runnable() { 48. @Override 49. public void run() { 50. Toast.makeText(getApplicationContext(), "我来自其他线程!",Toast.LENGTH_SHORT).show(); 51. } 52. }); 53. } 54. 55. @Override 56. public void onClick(View v) { 57. Toast toast = null; 58. switch (v.getId()) { 59. 60. case R.id.original: //默认Toast样式处理 61. Toast.makeText(getApplicationContext(), "默认Toast样式",Toast.LENGTH_SHORT).show(); 62. break; 63. 64. case R.id.byphoto: //带图片Toast样式处理 65. toast = Toast.makeText(getApplicationContext(),"带图片的Toast", Toast.LENGTH_LONG); 66. toast.setGravity(Gravity.CENTER, 0, 0); 67. //实例化线性布局 68. LinearLayout toastView = (LinearLayout) toast.getView(); 69. //加载图像 70. ImageView imageCodeProject = new ImageView(getApplicationContext()); 71. imageCodeProject.setImageResource(R.drawable.ic_launcher); 72. toastView.addView(imageCodeProject, 0); 73. toast.show(); 74. break; 75. 76. case R.id.customposition: //自定义位置Toast样式处理 77. toast = Toast.makeText(getApplicationContext(),"自定义位置Toast", Toast.LENGTH_LONG); 78. toast.setGravity(Gravity.CENTER, 0, 0); 79. toast.show(); 80. break; 81. 82. case R.id.alldiy: //完全自定义位置Toast样式处理 83. 84. /* setContentView()一旦调用, layout就会立刻显示UI;而inflate只会把Layout形成一个以view类实现成的 85. * 对象。 有需要时再用setContentView(view)显示出来。一般在activity中通过setContentView()将界面显 86. * 示出来,但是 如果在非activity中如何对控件布局设置操作了,这就需要LayoutInflater动态加载。 */ 87. LayoutInflater inflater = getLayoutInflater(); 88. //inflate(int Resourece,ViewGroup root)作用:填充一个新的视图层次结构从指定的XML资源文件中 89. View layout = inflater.inflate(R.layout.custom,(ViewGroup) findViewById(R.id.customtoast)); 90. //加载图像 91. ImageView image = (ImageView) layout.findViewById(R.id.picture); 92. image.setImageResource(R.drawable.ic_launcher); 93. //设置标题 94. TextView title = (TextView) layout.findViewById(R.id.titletoast); 95. title.setText("完全自定义Toast"); 96. //显示内容 97. TextView text = (TextView) layout.findViewById(R.id.prompt); 98. text.setText("显示提示信息……"); 99. toast = new Toast(getApplicationContext()); 100. toast.setGravity(Gravity.RIGHT | Gravity.TOP, 12, 40); 101. toast.setDuration(Toast.LENGTH_LONG); 102. toast.setView(layout); 103. toast.show(); 104. break; 105. 106. case R.id.bythread: 107. //实例化线程 108. new Thread(new Runnable() { 109. public void run() { 110. showToast(); 111. } 112. }).start(); 113. break; 114. } 115. 116. } 117. } 说明: Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的时间有限,过一定的时间就会自动消失。 三、运行效果 第11章、 图片切换ImageSwitcher&Gallery ImageSwitcher是Android中控制图片展示效果的一个控件,如:幻灯片效果...,颇有感觉啊。做相册一绝。 一、设计界面 1、打开“res/layout/activity_main.xml”文件。 打开activity_main.xml文件。 代码如下: TextCopy to clipboardPrint 1. 2. 3. 4. xmlns:android="http://schemas.android.com/apk/res/android" 5. android:layout_width="match_parent" 6. android:layout_height="match_parent"> 7. 8. 9. android:layout_width="match_parent" 10. android:layout_height="match_parent" 11. android:layout_alignParentTop="true" 12. android:layout_alignParentLeft="true" /> 13. 14. 15. android:background="#55000000" 16. android:layout_width="match_parent" 17. android:layout_height="60dp" 18. android:layout_alignParentBottom="true" 19. android:layout_alignParentLeft="true" 20. android:gravity="center_vertical" 21. android:spacing="16dp" /> 22. 23. 二、程序文件 打开“src/com.genwoxue.imageswitcher/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.imageswitcher; 2. 3. import android.app.Activity; 4. import android.content.Context; 5. import android.os.Bundle; 6. import android.view.View; 7. import android.view.ViewGroup; 8. import android.view.Window; 9. import android.view.animation.AnimationUtils; 10. import android.widget.AdapterView; 11. import android.widget.BaseAdapter; 12. import android.widget.Gallery; 13. import android.widget.ImageSwitcher; 14. import android.widget.ImageView; 15. import android.widget.AdapterView.OnItemClickListener; 16. import android.widget.AdapterView.OnItemSelectedListener; 17. import android.widget.Gallery.LayoutParams; 18. import android.widget.ViewSwitcher.ViewFactory; 19. 20. public class MainActivity extends Activity implements OnItemSelectedListener, ViewFactory { 21. //声明ImageSwitcher、Gallery 22. private ImageSwitcher is=null; 23. private Gallery gallery=null; 24. 25. //定义缩微图 26. private Integer[] mThumbIds = { 27. R.drawable.a, 28. R.drawable.b, 29. R.drawable.c, 30. R.drawable.d, 31. R.drawable.e}; 32. //定义图 33. private Integer[] mImageIds = { 34. R.drawable.a, 35. R.drawable.b, 36. R.drawable.c, 37. R.drawable.d, 38. R.drawable.e}; 39. 40. 41. @Override 42. protected void onCreate(Bundle savedInstanceState) { 43. 44. super.onCreate(savedInstanceState); 45. requestWindowFeature(Window.FEATURE_NO_TITLE); 46. setContentView(R.layout.activity_main); 47. 48. is = (ImageSwitcher) findViewById(R.id.switcher); 49. is.setFactory(this); 50. 51. //显示效果 52. is.setInAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_in)); 53. is.setOutAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_out)); 54. 55. gallery = (Gallery) findViewById(R.id.gallery); 56. gallery.setAdapter(new ImageAdapter(this)); 57. //设置OnItemSelected监听事件 58. gallery.setOnItemSelectedListener(this); 59. } 60. 61. @Override 62. public View makeView() { 63. ImageView i = new ImageView(this); 64. i.setBackgroundColor(0xFF000000); 65. i.setScaleType(ImageView.ScaleType.FIT_CENTER); 66. i.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 67. return i; 68. } 69. 70. public class ImageAdapter extends BaseAdapter { 71. public ImageAdapter(Context c) { 72. mContext = c; 73. } 74. 75. public int getCount() { 76. return mThumbIds.length; 77. } 78. 79. public Object getItem(int position) { 80. return position; 81. } 82. 83. public long getItemId(int position) { 84. return position; 85. } 86. 87. public View getView(int position, View convertView, ViewGroup parent) { 88. ImageView i = new ImageView(mContext); 89. i.setImageResource(mThumbIds[position]); 90. i.setAdjustViewBounds(true); 91. i.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 92. i.setBackgroundResource(R.drawable.e); 93. return i; 94. } 95. private Context mContext; 96. } 97. 98. @Override 99. public void onItemSelected(AdapterView> parent, View view, int position,long id) { 100. is.setImageResource(mImageIds[position]); 101. } 102. 103. @Override 104. public void onNothingSelected(AdapterView> parent) { 105. } 106. 107. } 三、运行效果 第12章、 开关控件Switch和ToggleButton Switch和ToggleButtn都是开关按钮,我们在WLAN、GPS常用开关控制。 一、设计界面 1、打开“res/layout/activity_main.xml”文件。 从工具栏向activity拖出1个Switch开关按钮、1个ToggleButton按钮。 2、打开activity_main.xml文件。 代码如下: TextCopy to clipboardPrint 1. 2. 3. 4. xmlns:android="http://schemas.android.com/apk/res/android" 5. android:layout_width="match_parent" 6. android:layout_height="match_parent" 7. android:orientation="vertical"> 8. 9. 10. android:id="@+id/wlan" 11. android:layout_width="wrap_content" 12. android:layout_height="wrap_content" 13. android:textOn="开" 14. android:textOff="关" 15. /> 16. 17. 18. android:id="@+id/gps" 19. android:layout_width="wrap_content" 20. android:layout_height="wrap_content" 21. android:text="ToggleButton" /> 22. 23. 二、程序文件 打开“src/com.genwoxue.switchtogglebutton/MainActivity.java”文件。 然后输入以下代码: TextCopy to clipboardPrint 1. package com.genwoxue.switchtogglebutton; 2. 3. import android.app.Activity; 4. import android.os.Bundle; 5. import android.widget.Switch; 6. import android.widget.ToggleButton; 7. import android.widget.CompoundButton; 8. import android.widget.CompoundButton.OnCheckedChangeListener; 9. import android.widget.Toast; 10. 11. 12. public class MainActivity extends Activity { 13. //声明Switch与ToggleButton 14. private Switch wlan=null; 15. private ToggleButton gps=null; 16. 17. @Override 18. protected void onCreate(Bundle savedInstanceState) { 19. super.onCreate(savedInstanceState); 20. setContentView(R.layout.activity_main); 21. //获取Swtich对象、ToggleButton对象 22. wlan=(Switch)super.findViewById(R.id.wlan); 23. gps=(ToggleButton)super.findViewById(R.id.gps); 24. 25. /*因为Switch组件继承自CompoundButton,在代码中可以通过实现CompoundButton.OnCheckedChangeListener接口,并 26. 实现其内部类的onCheckedChanged来监听状态变化。*/ 27. wlan.setOnCheckedChangeListener(new OnCheckedChangeListener() { 28. @Override 29. public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 30. if(isChecked) 31. Toast.makeText(getApplicationContext(), "Switch状态为开", Toast.LENGTH_SHORT).show(); 32. else 33. Toast.makeText(getApplicationContext(), "Switch状态为关", Toast.LENGTH_SHORT).show(); 34. } 35. }); 36. 37. /*因为ToggleButton组件继承自CompoundButton,在代码中可以通过实现CompoundButton.OnCheckedChangeListener接口,并 38. 实现其内部类的onCheckedChanged来监听状态变化。*/ 39. gps.setOnCheckedChangeListener(new OnCheckedChangeListener(){ 40. @Override 41. public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 42. if(isChecked) 43. Toast.makeText(getApplicationContext(), "Switch状态为开", Toast.LENGTH_SHORT).show(); 44. else 45. Toast.makeText(getApplicationContext(), "Switch状态为关", Toast.LENGTH_SHORT).show(); 46. } 47. }); 48. } 49. 50. } 三、运行效果