自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 资源 (61)
  • 问答 (1)
  • 收藏
  • 关注

原创 Git push 常见用法

Git push 在使用git commit命令将修改从暂存区提交到本地版本库后,只剩下最后一步将本地版本库的分支推送到远程服务器上对应的分支了,如果不清楚版本库的构成,可以查看我的另一篇,git 仓库的基本结构。 git push的一般形式为 git push <远程主机名> <本地分支名> <远程分支名> ,例如git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机or...

2021-01-14 23:24:38 154

原创 Centos搭建Git服务器,添加用户名密码实现多用户管理

1、安装git,使用yum源在线安装命令:yuminstall -y git注:没有yum命令得先安装yum2、初始化git仓库,在/home/data/git/路径下初始化一个空的仓库gittest命令:gitinit --bare /home/data/git/gittest.git注:git安装成功后才可以初始化3、创建组及创建用户4、禁用git用户的shell登录,防止用户通过Git用户登录服务器。编辑/etc/路径下的passwd文件,将文件后...

2021-01-08 09:08:51 549

原创 macOs 电脑中下载 brew Homebrew 国内镜像版本

macOs 电脑中下载 brew Homebrew 国内镜像版本https://gitee.com/cunkai/HomebrewCN

2021-01-07 22:28:20 616

原创 git国内镜像下载地址:git-2.27.0-intel-universal-mavericks.dmg

git国内镜像下载地址:https://www.newbe.pro/Mirrors/Mirrors-Git-For-MacOS/

2021-01-07 22:19:28 1200 1

原创 Mac环境Golang安装及环境变量配置

mac 环境安装go一.下载1.国内下载地址(外网下载慢 , 使用的是国内镜像)https://studygolang.com/dl2.安装好后配置环境变量默认安装位置为/usr/local/go/bin1.cd~进入目录2.ls-all 查看是否存在.bash_profile3.如果不存在该文件 手动创建touch .base_profile4.编辑vim .base_profileexport GOPATH=/Library/Java/MySpace/go_project 指定项..

2020-12-24 06:02:59 978

原创 VSCode 预览 .md 文件

VSCode安装md插件选择Extensions, 输入Markdown Theme Kit,下面会出现相应插件,点击install(截图中因为我已经安装,所以是设置)或者安装插件Markdown Shortcuts也可以,后来发现这个更好用一些安装完毕,重启VSCode,然后打开.md文件。Ctrl + Shift + V,即可预览。然后双击相应位置即可修改对应内容...

2020-12-24 05:42:35 1493

原创 js 判断是否是 iPhone X

        var isiOS;        function fnMoble() {            isiOS = /iphone/gi.test(navigator.userAgent) &amp;&amp; (screen.height == 812 &amp;&amp; screen.width == 375);        }

2018-05-11 03:37:30 2255

原创 jquery过滤特殊字符 及 js字符串转为数字

//替换特殊字符 $(this).val($(this).val().replace(/[~'!&lt;&gt;@#$%^&amp;*()-+_=:]/g, "")); 方法主要有三种转换函数、强制类型转换、利用js变量弱类型转换。1. 转换函数:js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两...

2018-04-09 21:05:45 599

原创 js判断当前手机的操作系统

&lt;script type="text/javascript"&gt;var u = navigator.userAgent;var isAndroid = u.indexOf('Android') &gt; -1 || u.indexOf('Adr') &gt; -1; //android终端var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS...

2018-04-09 19:37:49 2952

原创 C:\inetpub\logs\LogFiles\W3SVC1

C:\inetpub\logs\LogFiles\W3SVC1

2017-12-14 14:17:36 4001

原创 在js中arguments.length的用法和意义

[html] view plain copyfunction imagePreload() {  var imgPreload = new Image();  for (i = 0; i  arguments.length; i++) {  imgPreload.src = arguments[i];  }  }  imagePreload(

2017-10-21 15:42:39 9782 2

转载 C# Post Json数据

public string Post(string Url, string jsonParas)    {        string strURL = Url;        //创建一个HTTP请求          HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL);        //

2017-06-28 21:38:30 2808

原创 Jquery 对json的增删改: 查询(遍历)

jquery 对得到的json 进行增删改 操作 各位高手可以写个例子出来吗?var ojson={'a':[{'id':'5'},{'id':'6'}],'b':[{'id':'8'},{'id':'9'}]};谢谢你 的回答 那我怎样删除 元素key 为 ‘b’的 元素呢 ? 删除后 我想要的效果是ojson={'a':[{'id':'5'},{'id':'6'}]}谢谢 有了答案立

2017-06-17 00:53:12 10748

转载 js实现touch移动触屏滑动事件

在开始描述touch事件之前,需要先描述一下多触式系统中特有的touch对象(android和iOS乃至nokia最新的meego系统都模拟了类 似的对象)。这个对象封装一次屏幕触摸,一般来自于手指。它在touch事件触发的时候产生,可以 通过touch event handler的event对象取到移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseo

2017-06-12 10:55:25 1745

转载 H5案例分享:移动端touch事件判断滑屏手势的方向

移动端touch事件判断滑屏手势的方向方法一当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY;当触发touchmove事件时,在获取此时手指的横坐标moveEndX和纵坐标moveEndY;最后,通过这两次获取的坐标差值来判断手指在手机屏幕上的滑动方向。思路:用touchmove的最后坐标减去touchstart的起始坐标,X的

2017-06-12 03:29:20 4649

原创 js刷新页面方法大全

Javascript刷新页面的几种方法:1,history.go(0)2,location.reload() 3,location=location 4,location.assign(location) 5,document.execCommand('Refresh') 6,window.navigate(location) 7,location.replace(

2017-02-13 13:13:00 345

原创 Jquery string 和 json相互转换的方法

第一种方式:使用js函数eval();testJson=eval(testJson);是错误的转换方式。正确的转换方式需要加(): testJson = eval("(" + testJson + ")");eval()的速度非常快,但是他可以编译以及执行任何javaScript程序,所以会存在安全问题。在使用eval()。来源必须是值得信赖的。需要使用更安全的js

2017-02-13 10:06:05 29056

原创 MySQL 字段添加 删除

添加一个新字段 :    ALTER TABLE  表 ADD 字段名字  varchar(100);  删除一个字段:    ALTER TABLE 表  DROP 字段名字;

2017-02-02 11:41:37 238

原创 JavaScript 执行父窗口function

window.parent.window.func(); // 调用父层window的func方法window.top.window.func(); // 调用顶层window的func方法,前提是func方法定义在最外层而不是在其他iframe里面当然你也可以把父层的js写成公用的,这样到拿一层都可以用

2016-12-26 14:42:20 1570

转载 微信企业号开发之如何管理多媒体文件

企业在使用接口时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。通过本接口,企业可以上传或下载多媒体文件。注意,每个多媒体文件(media_id)会在上传到微信服务器3天后自动删除,以节省服务器资源。一、上传媒体文件用于上传图片、语音、视频等媒体资源文件以及普通文件(如doc,ppt),接口返回媒体资源标识ID:media_id。请注意,med

2016-11-22 20:16:54 601

转载 微信企业号开发之加密方案与全局返回码说明(3)

微信企业号开发之加密方案与全局返回码说明 三、全局返回码说明企业号每次调用接口时,可能获得正确或错误的返回码,企业可以根据返回码信息调试接口,排查错误。全局返回码说明如下:返回码说明-1系统繁忙0请求成功40001获取access_token时Secret错误,或者acc

2016-11-22 20:15:54 2067

原创 如何关闭80端口,怎样关闭80端口

关闭的方法:点击开始→控制面板→网络连接→本地连接→右键→属性,然后选择Internet(tcp/ip)→属性,。在Internet(tcp/ip)属性对话框中选择高级选项卡。在高级TCP/IP设置对话框中点选选项→TCP/IP筛选→属性,。在这里分为3项,分别是TCP、UDP、IP协议。假设关闭浏览,那就需要关闭80端口,只要在TCP端口上删除80端口,然后确定。注意:修改完以后系统会提示重新启

2016-11-19 05:27:48 4760

原创 Windows系统如果不能创建 .name 带点前的文件夹怎么办

您好,可以用windows下cmd cd到服务器路径,然后用md .well-known来创建

2016-11-17 08:05:27 2666 1

原创 如何使用jquery刷新当前页面

如何使用jquery刷新当前页面下面介绍全页面刷新方法:有时候可能会用到window.location.reload()刷新当前页面.parent.location.reload()刷新父亲对象(用于框架)opener.location.reload()刷新父窗口对象(用于单开窗口)top.location.reload()刷新最顶端对象(用于多开窗口)

2016-10-27 23:20:05 1595

原创 如何使用jquery刷新当前页面

如何使用jquery刷新当前页面下面介绍全页面刷新方法:有时候可能会用到window.location.reload()刷新当前页面.parent.location.reload()刷新父亲对象(用于框架)opener.location.reload()刷新父窗口对象(用于单开窗口)top.location.reload()刷新最顶端对象(用于多开窗口)

2016-10-27 23:19:49 485

原创 mvc get 长度控制

mvc get 长度控制

2016-10-27 22:18:05 320

转载 normal

secpol.msc  修改administrator默认名HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp\PortNumber  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Term

2016-10-13 02:58:41 320

转载 Windows系统下获取SYSTEM权限设置的方法

默认情况下,我们无法直接在登录对话框上以SYSTEM帐户的身份登录到Windows桌面环境。实际上SYSTEM帐户早就已经“盘踞”在系统中了。想想也是,连负责用户验证的Winlogon、Lsass等进程都是以SYSTEM身份运行的,谁还能有资格检验SYSTEM呢?既然SYSTEM帐户早就已经出现在系统中,所以只需以SYSTEM帐户的身份启动Windows的Shell程序Explorer,就相当于用

2016-10-13 00:25:24 11401 1

转载 史上最全的ASP.NET MVC路由配置,以后RouteConfig再弄不懂神仙都难救你啦~

原文http://www.cnblogs.com/zeusro/p/RouteConfig.html 装载注明出处,爬虫请自重。继续延续坑爹标题系列。其实只是把apress.pro.asp.net.mvc.4.framework里的CHAPTER 13翻译过来罢了,当做自己总结吧。内容看看就好,排版就不要吐槽了,反正我知道你也不会反对的。先说一下基本的路由规则原则。基本的路由规则是

2016-10-09 21:31:40 7181

转载 MVC跨域CORS扩展

一般的基于浏览器跨域的主要解决方法有这么几种:1.JSONP       2.IFrame方式    3.通过flash实现  4.CORS跨域资源共享  ,这里我们主要关注的是在MVC里面的CORS跨域,其余的方式大家可以在网上找到相关的知识看一下。       CORS的原理:     CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域

2016-10-05 07:09:59 999

原创 Table中合并单元格

           //----------------------横向合并3个td                           //-----------------------纵向合并两个td,本tr中有3个td,下面的tr中有两个td             &

2016-10-04 21:23:22 428

转载 jQuery 清空div样式 $("#UserDivID").empty()

$.ajax({            url: "SearchSN.aspx",            data: "SN=" + $("#txtStorageSN").val(),            cache: false,            success: function (html) {                $("#showResult").em

2016-10-04 20:26:20 3758

原创 js 返回上一页和刷新

1. Javascript 返回上一页history.go(-1), 返回两个页面: history.go(-2);2. history.back().3. window.history.forward()返回下一页4. window.history.go(返回第几页,也可以使用访问过的URL) 例:向上一页response.Write("")

2016-10-03 17:10:01 280

转载 C#获取Url不同路径的方法大全

在 C# 中,用 Request 对象来获取 Url  的各种路径,包括上一页 Url、域名、绝对路径、相对路径和物理路径。虽然在某些情况下,无法获取到 Url,但可以获取到大部分情况下的 Url,下面一一介绍。   一、获取当前页和前一页Url  1、获取当前页:HttpContext.Current.Request.Url.PathAndQuery;  说明:P

2016-10-03 17:02:42 5736

转载 .net web api 解决ajax跨站点post请求提交 json 数据问题

asp.net web api 解决ajax跨站点post请求提交 json 数据问题一、web apiweb api 的 controller ,必须继承 apicontroller:public class TestController : ApiControlleraction 可以使用参数绑定直接将 post 请求带的 json 转化为对

2016-09-28 22:51:13 1616

转载 修改Win7 Win8 Win2012远程桌面端口

Windows 7/Vista/XP/2003等系统中的远程终端服务是一项功能非常强大的服务,同时也成了入侵者长驻主机的通道,入侵者可以利用一些手段得到管理员账号和密码并入侵主机。下面,我们来看看如何通过修改默认端口,防范黑客入侵。  远程终端服务基于端口3389。入侵者一般先扫描主机开放端口,一旦发现其开放了3389端口,就会进行下一步的入侵,所以我们只需要修改该务默认端口就可以避开大多

2016-09-27 22:38:06 477

转载 MySQL添加字段和修改字段的方法

MySQL添加字段的方法并不复杂,下面将为您详细介绍MySQL添加字段和修改字段等操作的实现方法,希望对您学习MySQL添加字段方面会有所帮助。1.登录数据库>mysql -u root -p 数据库名称2.查询所有数据表>show tables;3.查询表的字段信息>desc 表名称;4.1添加表字段alter table table1 add

2016-09-12 17:35:30 14067

转载 Sublime Text3 快捷键汇总及设置快捷键配置环境变量

Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选择需要合并的多行时)Ctrl+L 选择整行(按住-继续选择下行)Ctrl+M 光标移动至括号内开始或结束的位置Ctrl+T 词互换Ctrl+U 软撤销Ctrl+P 查找当前项目中的文件和快速搜索;输入 @ 查找文件主标题/函数;或者

2016-01-12 22:45:04 399

原创 .NET搭配MySQL开发的注意事项

为什么要用 MySQL 原因很简单:便宜,货好。好用不贵。免费是嘛1、先要下载 mysql-for-visualstudio-1.2.5  毕竟是用vs来搞嘛2、mysql-workbench-community-6.3.5-winx64 用这个workbench来管理还是很方便3、连接mysql-connector-net-6.9.8必不可少4、如果你是用EF来搞,要注意

2015-11-08 11:16:51 446

原创 在.NET 中使用mysql时间问题,

在.NET 中使用mysql时间问题,连接字符串上加这2个,搞定Allow Zero Datetime=True;Convert Zero Datetime=True不要问为什么,爱过~!

2015-11-08 10:07:05 587

mac版 git-2.27.0-intel-universal-mavericks.dmg 下载

mac版 git-2.27.0-intel-universal-mavericks.dmg 下载

2021-01-07

中国省市县三级数据库表SQL完美版

中国省市县三级数据库表SQL完美版

2014-10-01

Reflector_最新8.3+注册机器。反编译神器

Reflector_最新8.3+注册机器。反编译神器

2014-09-13

jQuery Select(单选) 模拟插件 V1.3.6

jQuery Select(单选) 模拟插件 V1.3.6

2012-12-09

验证码.html js写的一个简单验证码。

验证码.html

2012-12-09

大型c#网站如何提高性能

大型c#网站如何提高性能.doc

2012-12-09

PDF文档:大型网站架构方案

PDF文档:大型网站架构方案

2012-12-09

jQuery实现select样式美化 jQselect.js

jQuery实现select样式美化 jQselect.js

2012-12-09

免费下载 解决FLASH有背景色 使FLASH透明不被遮挡

( 解决FLASH有背景色 使FLASH透明不被遮挡.txt 概述:我们常遇见FLASH添加后有背景颜色和FLASH总是遮挡着其它效果或漂浮广告等问题?下面我们介绍给大家解决这一问题的方法:使FLASH变透明 如果要用到Dreamweavr 中,在插入flash后,单击右键 选择"参数" 在弹出的对话框中 左边输入"wmode" 右边输入"transparent" OK! 也可以通过代码(源码)来实现: 在添加的FLASH调用代码中增加"<param name="wmode" value="transparent">"即可实现透明化。 &lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="622" height="77"&gt; <param name="movie" value="swf/menu.swf"> <param name="quality" value="high"> <param name="wmode" value="transparent"> '添加的代码 &lt;embed src="swf/menu.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="622" height="77"&gt;&lt;/embed> &lt;/object&gt;

2012-02-17

NET程序实现多语言

NET程序实现多语言

2012-02-16

G大型网站架构演变和知识体系

G大型网站架构演变和知识体系

2012-02-16

免费下载 Android系统移植技术详解

Android系统移植技术详解

2012-02-16

免费下载《深入浅出Android》Android开发经典教材

免费下载《深入浅出Android》Android开发经典教材

2012-02-16

免费下载-Android驱动开发入门及手机案例开发分析教程

免费下载-Android驱动开发入门及手机案例开发分析教程

2012-02-16

免费下载 Android开发API函数详解

免费下载 Android开发API函数详解 免费下载 Android开发API函数详解 属性名称描述 android:autoLink 设置是否当文本为URL链接/email/电话号码/map时,文 本显示为可点击的链接。可选值 (none/web/email/phone/map/all) android:autoText 如果设置,将自动执行输入值的拼写纠正。此处无效 果,在显示输入法并输入的时候起作用。 android:bufferType 指定getText()方式取得的文本类别。选项editable 类 似于StringBuilder可追加字符,也就是说getText后可 调用append方法设置文本内容。spannable 则可在给定 的字符区域使用样式,参见这里1、这里2。 android:capitalize 设置英文字母大写类型。此处无效果,需要弹出输入法 才能看得到,参见EditText此属性说明。 android:cursorVisible 设定光标为显示/隐藏,默认显示。 android:digits 设置允许输入哪些字符。如“1234567890.+-*/%\n()” android:drawableBottom 在text的下方输出一个drawable,如图片。如果指定一 个颜色的话会把text的背景设为该颜色,并且同时和 background使用时覆盖后者。 android:drawableLeft 在text的左边输出一个drawable,如图片。 android:drawablePadding 设置text与drawable(图片)的间隔,与drawableLeft、 drawableRight、drawableTop、drawableBottom一起使 用,可设置为负数,单独使用没有效果。 android:drawableRight 在text的右边输出一个drawable,如图片。

2012-02-16

免费下载 Android编程入门教程

免费下载 Android编程入门教程 InstallAndroid 安裝 Android 開發工具 Android 提供免費而且跨平台的整合開發環境,只要電腦能連接上網路,我們隨時都能下載相關工具下來,並開始開發 Android 應用程式。 有了輕鬆易用的開發工具,我們可以把心力專注於如何將想法實現到應用程式上。 系統需求 撰寫 Android 的應用程式,需要一套個人電腦系統。至於作業系統的部份,幾個主流作業系統都有支援。 支援的作業系統如下: • Windows XP 或 Vista • Mac OS X 10.4.8 或之後版本 (適用 x86 架構的 Intel Mac) • Linux (官方於 Ubuntu 6.10 Dapper Drake 上測試) 我們需要安裝一些 Android 開發環境所需的程式工具,這些工具都是可以免費上網取得的: • JDK 5 或 JDK 6 你需要安裝 Java 開發工具 (JDK 5 或 JDK 6)。 只安裝 Java 運行環境(JRE) 是不夠的,你需要安裝 Java 開發環境 (JDK)。 你可以在命令行上輸入 「java -version」 來查看目前系統上已安裝的 java 版本(java 版本需 >1.5)。 要注意的是 Android 與 Java Gnu 編譯器 (gcj) 還不相容。 • Eclipse IDE,一個多用途的開發工具平台。 你可以下載安裝 Eclipse 3.5 (代號 Galileo) 、 3.4 (代號 Ganymede) 或 Eclipse 3.3 (代號 Europa) 版。 請注意你選擇的版本需包含 Eclipse Java 開發工具擴充套件(Java Development Tool Plugin, JDT)。 大多數 Eclipse IDE 包中都已含有 JDT 擴充套件。若對 Eclipse 平台不熟悉的話,建議直接選擇 「for Java Developers」版本來下載。 • ADT,基於 Eclipse 的 Android 開發工具擴充套件 (Android Development Tools plugin)。 • Android SDK,Android 程式開發套件,包含 Android 手機模擬器(Emulator)。 • 其他開發環境工具(非必要安裝) o Linux 和 Mac 環境上需要自動編譯的話可以自行安裝 Apache Ant 1.6.5 或之後版本,Windows 環境上則需要 Apache Ant 1.7 或之後版本。 o NetBeans、IDEA 等開發平台亦有推出自己的 Android 開發工具,但本書中還是以討論官方基於 Eclipse 平台的開發工具為準,其他平台不予涉及。 安裝流程 假設讀者已先安裝了 JDK 5 或 JDK 6。 那麼 Android 的安裝流程可以分為以下五個步驟 1. 下載 Eclipse 2. 安裝 Eclipse 3. 安裝 ADT 擴充套件 4. 下載 Android SDK 5. 設定 Android SDK 詳細的安裝流程如下: 1. 下載 Eclipse 首先我們需要下載 Android 開發時會用到的整合開發環境 Eclipse。 目前 Android 應用程式只支援使用「Java」程式語言來編寫 Android 應用程式。所以開發前必須先安裝 Java 開發套件(Java Development Kit, JDK)。 各平台的 JDK 可至 http://java.sun.com 下載。 Mac OS X 作業系統則已內建 JDK。 安裝好 JDK 後,我們可以前往 Eclipse 網站下載 Eclipse 這個方便的整合開發環境。 下載 Eclipse 時請選「Eclipse IDE for Java Developers」或「Eclipse IDE for Java EE Developers」這兩種版本,只有這兩種版本才會預裝 Eclipse JDT 擴充套件。 範例中所選擇的是「Eclipse IDE for Java Developers」版本。 下載完同樣先解壓縮到適當目錄下。 2. 安裝 Eclipse Eclipse 不需要安裝,只要確認你的系統上有安裝 Java,即可直接開啟 Eclipse 資料夾,點擊 Eclipse 開始執行 Eclipse 整合開發環境。 第一次啟動 Eclipse 時會彈出視窗讓你決定預設的工作目錄。一般使用 Eclipse 預設的工作目錄即可。 進入到 Eclipse IDE 後,不必急著四處觀望。我們先來安裝 Android 開發工具擴充套件。 3. 安裝 ADT 擴充套件 我們將在 Eclipse 上 安裝 Android 開發工具 (ADT)。 Eclipse 3.5 版 找到螢幕上方的選單列, 選擇 「Help->Install New Softare」 選項,這選項會帶出一個新視窗。 選擇「Available Software」標籤,選擇右方的 「Add...」 (新增網站)按鈕,會彈出一個輸入框。 在輸入框中的"Location"欄位中輸入擴充套件的名稱(Name) 「ADT」 跟網址(URL) 「http://dl-ssl.google.com/android/eclipse/site.xml 」,按下 "OK" 按鈕離開。Eclipse 會花一點時間尋找合適的版本。 在視窗中全選「 https://dl-ssl.google.com/android/eclipse/site.xml 」項目「Developer Tools」中的的選項後,按下右方的「Install」按鈕。 按下 「Next」 (下一步)鍵。照著步驟就安裝完成。安裝完會提示需重新啟動 Eclipse,按下 「Yes」 重新啟動。 Eclipse 3.4 版 找到螢幕上方的選單列, 選擇 「Help->Software Updates」 選項,這選項會帶出一個新視窗。 選擇「Available Software」標籤,選擇右方的 「Add Site...」 (新增網站)按鈕,會彈出一個輸入框。 在輸入框中的"Location"欄位中輸入網址(URL) 「http://dl-ssl.google.com/android/eclipse/site.xml 」, 按下 "OK" 按鈕離開。Eclipse 會花一點時間尋找合適的版本。 在視窗中全選「 https://dl-ssl.google.com/android/eclipse/site.xml 」項目「Developer Tools」中的的選項後,按下右方的「Install」按鈕。 按下 「Next」 (下一步)鍵。照著步驟就安裝完成。安裝完會提示需重新啟動 Eclipse,按下 「Yes」 重新啟動。 Eclipse 3.3 版 找到螢幕上方的選單列, 選擇 「Help->Software Updates->Find and Install」 選項,這選項會帶出一個新視窗。 選擇 「Search for new features to install」 (搜尋新功能供安裝)選項,按下 「Next」 (下一步)鍵。出現設定畫面。 選擇右上角的 「New Remote Site」 (新增遠端網站)按鈕,會彈出一個 「New Update Site」 (新增更新網站)輸入框。 在輸入框中輸入擴充套件的名稱(Name) 「ADT」 跟網址(URL) 「http://dl-ssl.google.com/android/eclipse/site.xml 」,按下 「OK」 按鈕離開。 按下 「Finish」 按紐繼續下一步。Eclipse 會花一點時間尋找合適的版本。 接著我們要做的,就是等 Eclipse 顯示出選項時,勾選合適的版本安裝。 安裝完會提示需重新啟動 Eclipse,按下 「OK」 重新啟動。 離線安裝 已經安裝成功的讀者可以跳過這段。有些讀者因為網路環境的關係,無法順利地直接線上安裝 Android 開發工具。這時我們可以先前往http://developer.android.com/sdk/adt_download.html ,手動下載最新的開發工具版本來離線安裝。 下載完最新的ADT 擴充套件後,打開 Eclipse 開發環境,找到螢幕上方的選單列, 選擇 「Help->Software Updates」 選項,這選項會帶出一個新視窗。選擇「Available Software」標籤,選擇右方的 「Add Site...」 (新增網站)按鈕,會彈出一個輸入框。 選擇右上角的「Local...」按鈕,並選取剛下載的 Android 最新開發工具檔案,選到之後按下 "OK" 按鈕離開。 在視窗中全選新出現項目的所有選項後,按下右方的「Install」按鈕。Eclipse 會花一點時間開始安裝 ADT 擴充套件。 4. 下載 Android SDK 接著我們要從 http://developer.android.com/ Android 官方網站下載 「Android 軟體開發套件」 (Software Development Kit, SDK)。 下載下來的 SDK 檔案需要先解壓縮。Windows 平台需要先另行安裝解壓縮程式,如免費的 7-zip 解壓縮工具。 解壓縮後會出現一個資料夾。為了之後描述方便,我們將解壓縮後的 Android SDK 檔案夾命名為「android_sdk」。 5. 設定 Android SDK 打開偏好設定頁面(Preference),選擇 Android 標籤(請確認您已安裝好 ADT 擴充套件,Android 標籤才會出現在偏好設定頁面中),在 SDK Location 欄位按下 " Browse..."鍵,選擇剛剛解壓縮完的「android_sdk」檔案夾所在地,然後按下視窗右下角的套用(Apply) 按鈕。 這樣一來,Android SDK 就算是設定好啦。 註解:若您安裝過 SDK 1.5 版之前的版本,請先移除後再重新安裝一次 ADT 擴充套件,才能順利設定新版的 Android SDK。 方法是在螢幕上方的選單列,選擇「Help > Software Updates」選項,在彈出的視窗上方點選「Installed Software」頁籤,選擇「Android」開頭的選項,點選右側的「Uninstall..」按鈕移除這些相關的插件。 下一步 設定好 Android SDK 後,我們就擁有了一個完整的 Android 開發環境。 我們先來看看 Android SDK 中提供的一些範例,好了解 Android 到底能做些什麼。 ManageSDK 管理 SDK 管理 SDK 下載 SDK 組件 在選單上選擇「Window > Android SDK and AVD Manager」選項,開啟 Android SDK/AVD 管理工具。 在開啟的管理工具視窗中,切換到「Installed Packages」標籤頁,「Installed Packages」列表中預設只裝了「Android SDK Tools」,不包含目標 SDK。我們需要先自行安裝對應的 SDK 組件。 切換到「Available Packages」 標籤頁,開始裝目標 SDK。點選預設的網址,可以看到目前可用的目標 SDK、文件、Add-On,要完成本書中範例,只要勾選對應版本的目標 SDK、文件、Add-On,然後按下「Install Selected」按鈕即可。 在下一個視窗中可確認剛勾選預備要安裝的 SDK 組件。勾選「Accept All」選項後,按下「Install Accepted」按鈕即開始自動下載並安裝。 在安裝完成後,切換到「Installed Packages」標籤頁,可以看到剛剛勾選的 SDK 組件都已經安裝到開發環境中。 刪除 SDK 組件 經過幾次 Android 版本升級後,我們的列表中可能會包含許多舊版本的 SDK。這時可以透過選取列表中的組件,點選下方的「Delete...」按鈕來刪除這些過時的組件。我們隨時還可以回到管理工具的「Available Packages」標籤頁,把組件下載回來。 安裝好 SDK 組件後,我們就可以開始來熟悉開發環境了。 OpenProject 開啟現有專案 開啟專案 我們回到 Eclipse 環境來。在螢幕上方的選單列上,選擇「File->New->Project」,會彈出「New Project」對話視窗。 Eclipse 是通用的編輯環境,可根據你所安裝的不同擴充套件而支援許多種類的專案。 點擊 「Android」 資料夾下的「Android Project」,會開啟「New Android Project」對話視窗。 我們將開啟「SDK 組件」中提供的 ApiDemos 範例。在「New Android Project」對話視窗中,點選 "Browse..."按鈕以選擇「開啟已經存在的專案」(Create project from existing source)。我們在此選擇位於「android_sdk/platforms/android-2.0/samples」目錄中的 Android 應用程式專案 (android_sdk/platforms/android-2.0/samples/ApiDemos)。 當我們選擇了現存的範例程式專案時,「New Android Project」對話視窗中的諸如專案名稱(Project Name)與屬性等內容都將被自動填寫好。這時我們可以按下 「Finish」按鈕,完成從現存專案新增專案到 Eclipse 環境的動作。 匯入專案 如果你的程式專案已位於工作環境(WorkSpace)資料夾下,想使用上述方法開啟專案時,會得到欲開啟的資料夾已在工作目錄下的警告。因此我們得用另一個方法:匯入專案。 在螢幕上方的選單列上,選擇「File->Import」選項,會跳出「Import」視窗。選擇「General->Existing Projects into WorkSpace」項目,然後按下「Next」按鈕帶到新一個畫面。在「Select Root Directory」欄位旁,按下右方的「Browse...」按鈕,選擇對應的專案。選擇好後,按下「Finish」按鈕完成從現存在工作環境(WorkSpace)資料夾下的專案匯入到 Eclipse 環境的動作。 不同 SDK 版本的範例專案會放在「android_sdk/platforms/android-版本/samples」目錄中,請自行根據要開發的版本來選擇範例。 修復專案 完成新增程式專案到 Eclipse 後,我們可以在左側的「Package Explorer」中找到我們新增的專案。 如果發現開啟後的資料夾圖示上有個小小的黃色驚嘆號,表示這個專案匯入後還有些問題,我們可以使用ADT內建的功能來試著修復專案屬性。 在「Package Explorer」的 「ApiDemos」 專案檔案夾圖示上點選右鍵,從「Android Tools」選單中選擇「修復專案屬性」(Fix Project Properties)。 (Android Tools->Fix Project Properties) 如果發現開啟後的資料夾圖示上有個小小的紅色叉號,表示這個專案開啟/匯入後遇到了無法編譯的問題。最常見的也是與無法正常生成「gen」目錄相關的問題。一般簡單的解決方式是打開專案中任一 XML 檔案(如AndroidManifest.xml 或是「res」目錄下附檔名為 .xml 的檔案),改變一下內容(如在檔案中多按一個空格)後存檔,這時開發工具會自動編譯生成「gen」目錄中新的內容。這樣無法編譯的問題往往就解決了。如何修改 XML 檔案在後面章節中會提到。 切換 SDK 版本 Android 在 SDK 1.5 版之後引入了支援多個版本 SDK 與模擬器的新特性,讓我們得以透過修改屬性設定畫面的設定,來切換用來編譯與運行這些專案的目標 SDK 版本。 在「Navigator」的「ApiDemos」專案檔案夾圖示上點選右鍵,選擇「properties」選項,會開啟專案屬性設定畫面。 在設定畫面中先選擇左方的 Android 標籤,選擇後會出現可勾選的「Project Build Target」選單。 在選單中選擇適當的目標版本,選擇好之後按下 OK 結束設定畫面,這時專案就已經切換成可使用目標版本編譯的狀態了。 PlayEmulator 操作 Android 虛擬機器 使用 Android 虛擬機器 我們已經透過「Eclipse」開發環境,開啟了「ApiDemos」專案。本章將講解如何設定和操作 Android 虛擬機器。 設定 Android 虛擬機器 現在我們還不忙著開始寫程式,先花點時間,來看看怎麼在開發環境中,透過「Android 虛擬機器」來執行應用程式吧。 由於在剛開始開發時,我們手邊並不一定已擁有 Android 設備。因此 Android 開發工具亦提供了相當強大的模擬器,能讓我們自由配置,模擬各種硬體規格的設備。在 Android 中一律把 Android 模擬器稱作「Android 虛擬機器」(Android Virtual Device),簡寫為「AVD」。 「Android 軟體開發套件」(SDK) 1.5 以上的版本提供了支援不同目標版本虛擬機器的功能,在使用虛擬機器之前,必須先建立一個虛擬機器後才可在 Eclipse 開發環境中使用。 SDK 中提供了一個「android」命令行工具(在 android-sdk/tools 中),可以用來建立新專案或是管理虛擬機器。在此我們使用「android」命令行工具來新建立一個虛擬機器。 列出虛擬機器類型 首先,把「android-sdk/tools 」目錄加入系統路徑,我們以後就可以在任何地方使用「android-sdk/tools 」目錄下的各種命令。 在 Windows 2000、XP、2003、Windows 7 這些作業系統裡,點選「控制台 > 系統 > 進階 > 環境變數」。在「系統變數(S)」欄中,選取「PATH」變數名稱後,再點選「編輯(I)」按鈕。 再此假設您安裝 Android SDK 的路徑是「C:\android-sdk\tools」,接著在彈出的視窗中將「;C:\android-sdk\tools」(注意要以分號隔開)這字串添在原本的字串之後,按下確定後重新啟動作業系統。 重開系統後選擇「開始 > 執行」,在彈出的輸入框中輸入「cmd」,即可開啟命令行工具並繼續以下的動作。 或是您也可以直接打開命令行,進入「android-sdk/tools 」目錄,輸入以下命令: $ android list targets 在沒有將 Android SDK 加入路徑的情況下,在 Linux 或 Mac 環境中要輸入 $ ./android list targets 螢幕上會列出所有支援的虛擬機器類型 $ android list targets Available Android targets: id: 1 Name: Android 1.1 Type: Platform API level: 2 Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P id: 2 Name: Android 1.5 Type: Platform API level: 3 Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P id: 3 Name: Google APIs Type: Add-On Vendor: Google Inc. Description: Android + Google APIs Based on Android 1.5 (API level 3) Libraries: * com.google.android.maps (maps.jar) API for Google Maps Skins: HVGA (default), HVGA-L, QVGA-P, HVGA-P, QVGA-L 在這邊列出了三種虛擬機器類型。分別是編號(id)為 1、2 的 Android 1.1、1.5 虛擬機器,與編號(id)為 3 的「Google APIs」,Google 把自己提供的應用程式(如 Google Map)放在「Google APIs」這個虛擬機器類型中,因此要開發 Google Map 等 Google 專屬應用程式時,就必須先建立編號 3 這類型的虛擬機器,稍後才能在適當的虛擬機器上作驗證。 建立虛擬機器 我們現在來建立一個基本的 Android SDK 2.0 虛擬機器。 在命令行中輸入以下命令: $ android create avd --target 1 --name eclair 這段命令的意思是:使用「android create avd」命令來建立一個新的虛擬機器,「 --target 1」參數的意思是這個虛擬機器使用 id 為 1 的 SDK 套件(Android 1.5),「--name eclair」參數的意思是將這個建立的虛擬機器命名為「eclair」。 產生的結果如下 $ android create avd --target 1 --name eclair Android 2.0 is a basic Android platform. Do you wish to create a custom hardware profile [no] Created AVD 'cupcake' based on Android 2.0 列出已建立的虛擬機器 我們可以使用 「Android」命令行工具提供的「list avd」命令,來列出所有我們已經建立的模擬器。 在命令行中輸入以下命令: $ android list avd 產生的結果如下: $ android list avd Available Android Virtual Devices: Name: eclair Path: /Users/mac/.android/avd/cupcake.avd Target: Android 2.0 (API level 5) Skin: HVGA 使用「 android list avd」命令看到有輸出,即表示已成功建立虛擬機器,可以回到 Eclipse 環境來,設定執行應用程式專案所需的環境參數了。 設定環境參數 要執行 ApiDemos 程式前,我們得在開發環境中,事先設定好一些用來執行 ApiDemos 程式的環境參數。 以後使用其他程式專案時,我們也能用同樣的方式,讓這些程式在我們的開發環境中運行。 首先,我們透過選單列上的「Run」(執行)選單,選擇「開啟執行參數設定」(Run-> Debug Configurations...) 進入運行環境參數設定畫面。 進入設定畫面後,在視窗左側會有一整排 Eclipse 支援的運行設定,我們從中找到 "Android Application"(Android 應用程式)項目,按下滑鼠右鍵,點選 "New"(新增)選項。 選擇 「New」 選項後,在「Android Application」項目下方會多出一筆執行項目。 我們可以在 Name 欄位上輸入一個代表這個環境參數的名稱,在此我們輸入與專案名稱相同的「ApiDemos」。 在「Project」欄位右方,點選「Browse...」按鈕,開啟「專案選擇」(Project Selection)視窗,選擇「ApiDemos」專案並點選「OK」按鈕,以選擇要執行的專案。 在 「Launch Action」 選單中,確認預設選擇的是「Launch Default Activity」。 至此我們就完成了模擬器環境參數的設定。 點選右下角的「Debug」按鈕,Eclipse 就會啟動 Android 虛擬機器。 小技巧: 在選單列中,也可以選擇設定「Run Configuration...」選項。這時我們得到的是一個幾乎完全相同的環境參數設定畫面,只是右下角的「Debug」按鈕變成了「Run」按鈕。「Debug」與「Run」模式的環境參數設定可以共用,差別在於「Debug」模式下可以使用在之後章節中會介紹的 logd,來顯示一些開發時所需的額外訊息。 再次啟動 Android 虛擬機器 當我們設定好之後,以後碰到要再次啟動虛擬機器的情況時,只要在螢幕左上角的「Debug」或「Run」圖示右側小箭頭上按一下,從彈出的選單中選擇剛剛設定的環境參數名稱,虛擬機器即開始執行,並安裝好我們所指定的專案應用程式。 操作虛擬機器 改變虛擬機器外觀 在建立虛擬機器的時候,我們可以透過「skin」欄位來選擇預設的虛擬機器外觀。「skin」欄位中會列出目標(Target)版本支援的所有外觀。「HVGA」(解析度 480x320)、「QVGA」(解析度 320x240)等分別代表著各種不同畫面的解析度 在命令列上執行「android list targets」命令後,我們可以看到螢幕上列出所有支援的模擬器類型。舉我們剛才建立過的(id 1)虛擬機器為例,列出訊息如下: id: 1 Name: Android 2.0 Type: Platform API level: 5 Skins: HVGA (default), QVGA, WQVGA400, WQVGA432, WVGA800, WVGA854 其中 Skins 欄位中會列出所有支援的模擬器佈景,預設有多種畫面配置選項可選擇。 要建立「QVGA」模式的模擬器,則在前一節「android create avd」命令後,附加上「--skin QVGA」選項即可。要將預設的「HVGA 直式」顯示改為橫式,則可以透過使用快速鍵,直接切換螢幕來達成。 切換螢幕方向 在 Windows 作業系統上按下 「Ctrl」和「F12」鍵 ,或是在 Mac OS X 作業系統上同時按下「fn」 和「7」鍵,螢幕就會從預設的直式顯示改成橫式顯示,再按一次則切換回原來的直式顯示。 移除程式 我們已經順利地啟動了虛擬機器,那麼,該怎麼移除安裝到虛擬機器上的程式哩? Android SDK 中提供一個 adb (Android Debugger) 命令行工具 (在 android-sdk/tools 中),我們可以用裡面的 shell 工具連上虛擬機器來移除應用程式。在某些平台上,這些動作可能需要擁有 root 權限才能執行。 首先打開命令列,啟動 adb shell $ adb shell 接著切換到 data/app 目錄中 $ cd data/app/ 使用 ls 命令(等同 windows 上命令行的 dir 命令)來檢視檔案列表 # ls com.example.android.apis.apk 接著使用 rm 命令來刪除 ApiDemos 應用程式 # rm com.example.android.apis.apk # ls 移除虛擬機器 我們可以使用「android list avd」命令來列出所有的虛擬機器 $ android list avd Available Android Virtual Devices: Name: eclair Path: /Users/mac/.android/avd/cupcake.avd Target: Android 2.0 (API level 5) Skin: HVGA 表示現在系統中有一個名為 eclair 的虛擬機器。 我們可以使用「android delete avd --name eclair」命令來刪除名稱為「eclair」的虛擬機器。 $ android delete avd --name eclair AVD 'eclair' deleted. 刪除後再次執行「android list avd」命令,得到的結果為 $ android list avd Available Android Virtual Devices: 表示系統中已經不存在任何模擬器,我們真的已經將虛擬機器刪除了。 ReadSource 建立一個 Android 程式 在前幾章我們已經學到怎麼開啟現有的專案,也導覽過了整個模擬器的設定流程。 現在我們從設計一個簡單實用的身高體重指數計算(BMI)應用程式開始,學習設計一個 Android 應用程式所需的基礎。 維基百科上這麼介紹 BMI 身高體重指數: 身高體重指數(又稱身體質量指數,英文為Body Mass Index,簡稱BMI)是一個計算值。 ...當我們需要比較及分析一個人的體重對於不同高度的人所帶來的健康影響時, BMI值是一個中立而可靠的指標。 簡而言之,我們要設計的程式就是允許輸入身高體重,按下「計算 BMI」鍵後就在螢幕上顯示 BMI 值,並彈出「你應該節食囉」、或「你應該多吃點」...等健康建議。健康建議的判斷: 只要 BMI 值超過 「25」 時就算偏胖、BMI 值低於 「20」 就算偏瘦。 判斷寫得很簡單。畢竟我們要學習的關鍵知識,不是在於 BMI 值的算法或健康建議的內容,而是在於 Android 程式的運作方式。 參考資源 http://zh.wikipedia.org/wiki/身高體重指數 我們這就先從建立一個新的程式專案開始吧。 建立新程式專案 首先,我們照前面章節的教學,建立一個新的程式專案。並將新專案名稱命名為 BMI。 在「內容」欄裡,我們選擇「在工作區域中建立新專案」(Create new project in workspace)。 這時,如果在"選擇欄"取消掉勾選「使用預設目錄」(Use default location) 選項,我們就可以切換儲存專案的資料夾。 大部分的時候我們並不需去改動這個選項,而是直接使用預設的資料夾。 前面章節中都是開啟現有的專案,因此那些專案屬性 (Properties) 等內容都被自動填寫好了。這章中要從無到有新建一個專案,因此我們必須自行填寫專案相關的屬性。 在此對"New Android Project" 對話框中出現的這些欄位作些簡單的說明: 名稱 描述 Project Name 包含這個項目的資料夾的名稱 Application Name 顯示在應用程式上的標題 Package Name 套件(Package)名稱,JAVA 的習慣是用套件名稱來區分不同的類別(class)。依照專案的不同,我們會起不同的路徑名稱。 Create Activity 使否建立這個是項目的主要類別,勾選後可以指定這個類別的名稱。這個類別是一個 Activity 類別的子類別。我們可以在「Activity」中啟動程式和控制程式流程,或是根據需要控制螢幕、界面。 Build Target 選擇用來編譯專案的 SDK 版本。 當選定了 Build Target 後,開發工具會在 Min SDK Version 欄位中自動填入對應的值 Min SDK Version 本應用程式所支援的最低 SDK 版本代號。 我們在欄位中分別填入以下的值: 名稱 值 Project Name BMI Application Name BMI Package Name com.demo.android.bmi Create Activity Bmi Min SDK Version 5(自動填入) 填好值後按下「Finish」 按鈕,就建立好新專案了。 注意 Package Name 的設定,必須至少由兩個部分所構成,例如:com.android。「Activity Name」是指定用來產生預設 java 程式碼的文件名稱,與文件中預設 Activity 類別 (class) 的名稱。依照 java 語言的命名習慣,「Activity Name」最好採用開頭大寫的形式。 回到 Eclipse 主畫面,我們注意到在左側 Package Explorer 視窗中已順利新增加了一個 BMI 目錄。 程式專案架構 乍看之下,Android 插件已幫我們建立了不少檔案。 檢視新建立的 BMI 檔案夾中的內容,我們可以將一個 Android 應用程式基本的檔案結構歸納成如下: 我們來看看 Android 應用程式的基本檔案結構,以及各自所負責的內容。 src/ 原始碼(source)目錄 src 目錄中包含了一個 Android 應用程式中所需的各個程式碼檔案。這些檔案被包在對應 package 的子目錄下。(如本章的 BMI 例子中,子目錄指的就是 /src/com/demo/android/bmi/) src 目錄中比較關鍵的程式有: 1. Bmi.java 這個檔案的檔名會隨著你在建立一個新的程式專案畫面中所填入「Create Activity」欄位值的不同而改變。這是新程式專案中的主要程式區塊。我們開發 Android 程式的多數時間,都是在 src 目錄下和 Android 打交道。 gen/ 自動生成(Generate)目錄 gen 目錄中存放所有自動生成的檔案。 gen 目錄中最關鍵的程式就是 R.java 檔。 1. R.java 這個檔是自動產生的。會由 ADT 插件自動根據你放入 res 目錄的 XML 描述文件、圖像等資源,同步更新修改 'R.java' 這個中介檔案。所有的 Android 程式中都會有以 R.java 為名的這個檔案,你完全不需要,也應避免手工修改 R.java 這個檔案。 R.java 中自動產生的 「R」 類別就像是個字典一樣,包含了使用者介面、圖像、字串等各式的資源與相應的編號(id)。Android 應用程式中很多時候會需要透過 R 類別調用資源。 編譯時編譯器也會查看這個資源列表,沒有使用到的資源就不會編譯進去,為手機應用程式節省不必要佔用的空間。 res/ 資源(Resource)目錄 「res」 目錄中存放所有程式中用到的資源檔案。"資源檔案"指的是資料檔案,或編譯時會被轉換成程式一部分的 XML 描述檔。Android 針對放在 「res」 目錄下的不同子目錄的資源,會有各自不同處理方式。因此我們寫程式時,最好能搞清楚各目錄下分別可放置的內容。 res/ 中的程式: 3. layout/ 版面配置(layout)目錄 「layout」目錄包含所有使用 XML 格式的介面描述檔。「layout」 中的 XML 介面描述檔就像寫網頁時用到的 HTML 檔案一樣,用來描述螢幕上的版面編排與使用的介面元件。XML 介面描述檔描述的內容可以是整張螢幕,也可以只描述一部分的介面(例如描述用來產生對話框的介面元件)。 雖然你也能直接通過 Java 來建立使用者介面,不過透過 XML 描述檔來建立使用者介面相對更簡單,架構也更清晰,以後維護時更容易釐清問題。要使用這些介面元件,應透過 「R.java」 檔中自動產生的 「R」 類別來調用。 4. values/ 參數值(value)目錄 「values」 目錄包含所有使用 XML 格式的參數值描述檔,可以在此添加一些額外的資源如字串(很常用)、顏色、風格等。使用時也是透過 「R」 類別來調用。 Android 功能清單 5. AndroidManifest.xml 「AndroidManifest.xml」 是 Android 程式的功能清單,應用程式在這裡列出該程式所提供的功能。當應用程式開啟時,會提供諸如內容提供者(ContentProvider)、處理的資料類型、實際運行的類別、跨應用程式的資訊等等訊息。 你可以在此指定你的應用程式會使用到的服務(諸如電話功能、網路功能、GPS功能等)。 當你新增一個頁面行為類別 (Activity) 時,你也需要先在此註冊這個新增的 Activity 類別後,才能順利調用。 AndroidUI 描述使用者介面 將一份創意落實到可執行的應用程式,背後需要的是從閱讀與寫作程式碼中累積的經驗,並有堅持理念、直到完成的耐心。 表達使用者介面 我們可以先用前幾章教的方法設定並執行模擬器,看看模擬器運作後的結果。 我們看到一個文字欄位,上面有一串文字 「Hello World, Bmi!」。這就是 Android 預設程式架構的範例囉。 由於才剛開始實際接觸到 Android 應用程式,我們先從簡單的開始:這一節中,我們的目標是將 「Hello World, Bmi!」 換成別的文字。 那麼,「Hello World, Bmi!」,這串字串藏在哪裡呢? 先打開 「res/layout/main.xml」 1 &lt;?xml version="1.0" encoding="utf-8"?&gt; 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" 6 > 7 <TextView 8 android:layout_width="fill_parent" 9 android:layout_height="wrap_content" 10 android:text="@string/hello" 11 /> 12 </LinearLayout> 原來「Hello World, Bmi!」字串就藏在「res/layout/main.xml」這個檔案的第 10 行中。我們只要簡單地將第 10 行修改成如下 android:text="Hello World, Bmi!” 再執行一次模擬器,就可以得到一個相似的應用程式,只是內文變成了我們剛剛修改的內容。 既然找到了「Hello World, Bmi!」字串,我們就試著將「android:text」屬性值從「Hello World, Bmi!」改成「哈囉,BMI」,然後執行看看吧。 android:text="哈囉,BMI" 結果發現 Android 模擬器中文嘛也通,字型也相當漂亮。 要開始學習 Android 應用程式確實很簡單吧?不過為了顯示「Hello World, Bmi」,也用到了許多程式碼。到底這些程式碼有什麼含意呢? 我們馬上來學習 「main.xml」這個 XML 介面描述檔的內涵吧。 Android 平台裡,使用者介面都是透過 ViewGroup 或 View 類別來顯示。ViewGroup 和 View 是 Android 平台上最基本的使用者介面表達單元。我們可以透過程式直接呼叫的方法,調用描繪使用者介面,將螢幕上顯示的介面元素,與構成應用程式主體的程式邏輯,混合在一起編寫。或是,也可以將介面顯示與程式邏輯分離,照著 Android 提供的這個較優雅的方式,使用 XML 描述檔,來描述介面元件的組織。 講解 我們看到的「Hello World, Bmi」就包含在「main.xml」 這個檔案中。 接著,我們就直接分部份來講解這個「main.xml」 檔案裡的內容: 第 1 行 &lt;?xml version="1.0" encoding="utf-8"?&gt; XML (Extensible Markup Language) 是一種標記描述語言,不管是語法還是看起來的樣子,都相當類似網頁所使用的 HTML 標記語言。XML 被廣泛地運用在 Java 程式的設定中。「main.xml」 文件裡,第一行是每個 XML 描述檔固定的開頭內容,用來指示這個文字檔案是以 XML格式描述的。 第 2, 6 與 12 行 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"></LinearLayout> 接著我們看到第一個標籤,與 HTML 網頁標籤相當類似。 <LinearLayout></LinearLayout> "線性版面配置"(LinearLayout)標籤,使用了兩個「LinearLayout」標籤,來表示一個介面元件的區塊。後頭的標籤前加上一個「/」符號來表示結束標籤。"線性版面配置" 所指的是包含在 「LinearLayout」 標籤中,所有元件的配置方式,是將一個接一個元件由上而下排隊排下來的意思。 xmlns:android="http://schemas.android.com/apk/res/android" xmlns 開頭的這串敘述,是用來宣告這個 XML 描述檔案的的名稱空間(NameSpace),後面接的URL(網址),表示這個描述檔案會參照到 Android 名稱空間提供的定義。 所有 Android 版面配置檔案的最外層標籤中,都必須包含這個屬性。 注意標籤需要兩兩對稱。一個標籤「 <linearlayout> 」在一串敘述的前頭,另一個標籤「 </linearlayout> 」在敘述的末尾。 如果你修改過的標籤沒有閉合(忘了加 <、/、> 等符號),Eclipse 畫面上也會出現小小的警示符號來提醒你。 第 3-5 行 android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" 這些包含在「 <linearlayout> 」標籤中的敘述被稱為「LinearLayout」標籤的「屬性」。Android 應用程式在 layout 目錄中的標籤,大多數的屬性前都有一個「android:」前綴。同一個介面元件的屬性之間,是以空白做區隔,因此事實上你也能將多個屬性寫在同一行。當然,將屬性排成多行更易於閱讀。我們應該保持這個好習慣。 介面元件都有許多共同的屬性,例如介面元件的長,寬度設定屬性。Android 介面元件的寬度、長度設定屬性分別叫做「android:layout_width」、「android:layout_height」。兩個都設定為 「fill_parent」參數值。「fill_parent」 如其名,所表達的的意思就是"填滿整個上層元件"。預設 LinearLayout 介面元件就會佔滿整個螢幕空間。 介面元件彼此間也會有一些不同的屬性,例如 「LinearLayout」(線性版面配置) 標籤的「android:orientation」(版面走向) 屬性。在此填入 「vertical」 (垂直)屬性值,表示這個介面的版面配置方式是從上而下垂直地排列其內含的介面元件。 「android.view.ViewGroup」 是各種佈局配置(layout)和視圖(View)元件的基礎類別。常見的實現有 LinearLayout(線性版面配置)、FrameLayout(框架版面配置)、TableLayout(表格版面配置)、AbsoluteLayout(絕對位置版面配置)、RelativeLayout(相對位置版面配置)等。 雖然有這麼多種版面配置方式可以選用,但大多數的應用程式並不需特地去改變預設的 LinearLayout 的配置,只要專注在其中填入需要的介面元件即可。所以從第 7 行之後的內容才是一般應用程式開發時較常修改之處。 第 7 和 11 行 <TextView /> TextView (文字檢視)是我們看到的第一個熟悉的介面元件。其作用是顯示文字到螢幕上。你可能注意到這個標籤結尾使用了 「/>」 符號。 「/>」符號表示這個XML敘述中沒有內文,亦即此介面元件描述中不再包含其他介面元件,也表示這個介面元件就是這個螢幕中最小的組成單元了。 第 8-10 行 android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello World, bmi" 我們來看看 TextView 介面元件中包含了哪些屬性。 「android: layout_width」和「android:layout_height」我們剛剛已經學過了,分別代表寬度跟長度。「android: layout_width」 的 「fill_parent」 參數值表示寬度填滿整個上層介面元件(即 LinearLayout 介面元件)。「android:layout_height」則是用上一個新的參數值「wrap_content」(包住內容),亦即隨著文字欄位行數的不同而改變這個介面元件的高度。最後的 「android:text」 屬性則是 TextView 介面元件的主要屬性,亦即文字欄位中顯示的文字內容。至於「@string/hello 」這段字串所代表的意義,馬上會接著在後面章節說明。我們現在已知道是:只要將「android:text」屬性內容替換成我們想要文字,在預覽畫面或在模擬器中就會顯示對應的文字。 將以上的 XML 描述綜合起來,我們就可以得知「main.xml」 想表達的介面。 BmiUI 設計使用者介面 視圖(View) 軟體設計的過程中,常常會遇到需要頻繁修改使用者介面的情境。改著改著程式設計師們就累積起了一些經驗,也歸納出了許多應對之道。如著名的 MVC(Model-View-Controller) 模式。Google Android 為我們考慮了介面修改問題。Android 為了單純化介面修改方式,採用了目前比較流行的解決方案--即將介面描述部份的程式碼,抽取到程式外部的 XML 描述文件中。 我們在前面的過程裡已經學到,如何在 Android 應用程式中替換 TextView 介面元件所顯示的純文字內容。那麼...這個經驗能不能直接用到 BMI 應用程式的設計上呢? 我們先回過頭來想想, BMI 應用程式最少應該需要什麼些什麼元件。 為了輸入 BMI 程式所需的身高體重值,大致上我們需要兩個 TextView 元件用來提示填入身高體重數字,另外也需要兩個文字輸入欄位用來填入身高體重數字。我們還需要一個按鈕來開始計算,而計算完也需要一個 TextView 元件來顯示計算結果。於是初版的 BMI 應用程式介面的樣子就浮現出來了。 查閱文件 話說回來,我們從哪得知各種可用的介面元件呢?其中一個方法是查閱文件。 Android 文件網站上找到各種可用介面元件列表。 http://developer.android.com/guide/tutorials/views/index.html 例如我們想查看 EditText 的內容,我們可以點進 EditText 連結查看其內容。 http://developer.android.com/reference/android/widget/EditText.html 你會看到一個詳細地驚人的網頁。 這邊舉其中常用到的 EditText 介面元件為例。EditText 介面元件的作用就是提供一個文字輸入欄位。EditText 繼承自另一個叫 TextView 的介面元件,TextView 介面元件的作用是提供文字顯示,所以 EditText 介面元件也擁有所有 TextView 介面元件的特性。 此外,文件中你也可以查找到 EditText 欄位的一些特殊屬性,如 「android:numeric="integer"」(僅允許輸入整數數字)、「android:phoneNumber="true"」(僅允許輸入電話號碼),或「android:autoLink="all"」(自動將文字轉成超連結)。 例如要限制 EditText 中只允許輸入數字的話,我們可以在 XML 描述檔中,透過將 EditText 的參數「android:numeric」 指定為 「true」,以限制使用者只能在 EditText 文字欄位中輸入數字。 離線文件 當你處於沒有網路連接的情況下時,也可以找到 Android 文件參考。 在下載了 android-sdk 後,將之解壓縮,你可以在「android-sdk/docs」 目錄中 (android_sdk/docs/reference/view-gallery.html) ,找到一份與線上文件相同的文件參考。 開始設計 我們從實例來開始,定義一個基本 BMI 程式所需的身高(Height)輸入欄位,就會用到 EditText,與 TextView 介面元件,其描述如下: 1 <TextView 2 android:layout_width="fill_parent" 3 android:layout_height="wrap_content" 4 android:text="身高 (cm)" 5 /> 6 <EditText android:id="@+id/height" 7 android:layout_width="fill_parent" 8 android:layout_height="wrap_content" 9 android:numeric="integer" 10 android:text="" 11 /> 可以看到 EditText 介面元件描述的基本的組成與 TextView 介面元件相似,都用到了「android:layout_width」與「android:layout_height」屬性。 另外,指定的另外兩個屬性「android:numeric」、「android:text」則是 EditText 介面元件的特別屬性。「android:text」屬性是繼承自 TextView 介面元件的屬性。 android:numeric="integer" android:text="" 將 「android:numeric」 指定為 「integer」,可以限制使用者只能在 EditText 文字欄位中輸入整數數字。「android:text」屬性則是指定 EditText 介面元件預設顯示的文字(數字)。 我們再來看看 Button (按鈕)介面元件 <Button android:id="@+id/submit" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="計算 BMI 值" /> Button 介面元件同樣有 「android:layout_width」與「android:layout_height」屬性,另外一個「android:text」屬性則用來顯示按鈕上的文字。 整合 我們這就從文件中挑出我們需要的 TextView(文字檢視)、EditText(編輯文字)、Button(按鈕) 三種介面元件,照前面的設計擺進 LinearLayout (線性版面配置)元件中。 完整的「main.xml」介面描述檔如下: &lt;?xml version="1.0" encoding="utf-8"?&gt; <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="身高 (cm)" /> <EditText android:id="@+id/height" android:layout_width="fill_parent" android:layout_height="wrap_content" android:numeric="integer" android:text="" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="體重 (kg)" /> <EditText android:id="@+id/weight" android:layout_width="fill_parent" android:layout_height="wrap_content" android:numeric="integer" android:text="" /> <Button android:id="@+id/submit" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="計算 BMI 值" /> <TextView android:id="@+id/result" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <TextView android:id="@+id/suggest" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> </LinearLayout> 我們可以啟動模擬器檢視執行結果。或是在頁面標籤下選擇「Layout」標籤,來預覽頁面配置。 啟動模擬器之後,模擬器畫面上出現了兩個輸入欄位。欄位上方分別標示著「身高 (cm)」、「體重 (kg)」。在兩個輸入欄位下方,是一個標示著「計算 BMI 值」的按鈕。 當你在欄位中試著輸入文字或數字(你可以直接用電腦鍵盤輸入,或按著模擬器上的虛擬鍵盤輸入)時,你也會發現,正 XML 描述檔的描述中對兩個 EditText 欄位所規定的,欄位中只能輸入數字。 我們在上面XML描述檔中定義的最後兩個 TextView 介面元件,由於並未替這兩個介面元件指定「android:text」屬性,所以在螢幕上並未顯示。這兩個介面元件在後面章節中會派上用場。 革命的路還長 高興了沒多久,你發現按下"計算 BMI 值" 按鈕後,應用程式完全沒反應。 這是正常的,因為我們還沒處理從介面輸入取得身高體重、將數值導入 BMI 計算方式、將結果輸出到螢幕上...等等 BMI 應用程式的關鍵內容。 不過在進入了解程式流程之前,我們還有一個「android:id」屬性尚未解釋哩。 接著我們將透過講解「android:id」屬性,來進一步了解 Android UI。 視覺化的介面開發工具 目前的 ADT 版本提供了預覽介面的功能,但尚未提供方便地視覺化拖拉介面元件的開發工具。以後也許 ADT 會加入完整的 GUI 拖拉設計工具。 但在 ADT 加入完整的 GUI 拖拉設計工具之前,已經有人寫出來了對應 Android 的 GUI 拖拉設計工具,可供使用。 DroidDraw - Android GUI 拖拉設計工具 http://code.google.com/p/droiddraw/ XmlR 存取識別符號 在上一章談了 XML描述檔中介面元件的各種「android:」開頭的屬性。要使用一個介面元件,第一件事就是定義出介面描述檔。大部分的介面元件(如 LinearLayout、TextView)不需要在程式中作後續處理,因此可以直接描述(例如我們前面定義過的 TextView 文字顯示元件「身高(cm)」)。但對於那些將在程式中被參考(reference)到的介面元件(如按鈕 Button、文字輸入欄位 EditText),我們需要先行在 XML描述檔中,定義該介面元件的「android:id」識別符號屬性。這麼一來在程式碼中我們要操作這個介面元件(取出欄位中輸入的資料、取得按下按鈕事件...)時,就能透過「android:id」識別符號來調用這個介面元件。 <EditText android:id="@+id/height" /> 前面章節提過,寫作時最好將 XML 描述檔屬性分行列出,以易於閱讀(增加可讀性)。而我們的範例卻將 android:id 屬性直接擺在 EditText 標籤後。其實這麼做同樣是基於易於閱讀的考量。當然你也可以將「android:id」屬性分行列出,或是將「android:id」屬性放在屬性列表的中間或最後頭,這些作法都是允許的,本書中一律採用將 android:id 屬性直接擺在介面元件標籤後的寫法。 android:id 屬性的內容長得比較特別: @+id/height 「height」是這個介面元件的 android:id。以後的程式中會使用「R.id.height」來取得這個介面元件。「@+id」 的意思是我們可以通過這個識別符號來控制所對應的介面元件,「R」類別會自動配置一個位址給這個介面元件。 「R」類別的內容則可以透過查看 R.java 得知。 XML 描述檔與 R.java 檔 在 Android 系統中,我們使用 XML 來定義 UI。但是有些稍微有經驗的開發者可能會有疑問: 「用 XML 來描述介面固然方便,但是對於手機程式來說,直接用 XML 檔案是不是太占空間了?」。 沒錯,如果 Android 是直接使用 XML 來儲存介面描述到手機上的話,一定會佔用比起現在大的多的檔案空間。解決的方法是Android 並不直接使用 XML 檔案,而是透過 Android 開發工具,自動將 XML 描述檔轉換成資源檔案。一旦應用程式要操作某個介面元件,或是使用任何種類的資源(字串、圖片、圖示、音效...),都使用索引來查詢。 當你建立一個 BMI 新專案,打開位於 「gen/com/demo/android/bmi」 目錄下的 「R.java」檔,你可以看到如下的程式碼: /* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * aapt tool from the resource data it found. It * should not be modified by hand. */ package com.demo.android.bmi; public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040000; } } 在照著前一章新增了 XML 描述後,再次打開打開 「gen/com/demo/android/bmi」 目錄下的 「R.java」 檔 ,你可以看到如下的程式碼: /* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * aapt tool from the resource data it found. It * should not be modified by hand. */ package com.demo.android.bmi; public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000; } public static final class id { public static final int height=0x7f050000; public static final int result=0x7f050003; public static final int submit=0x7f050002; public static final int suggest=0x7f050004; public static final int weight=0x7f050001; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040000; } } 我們看到在 R.java 檔案中,分別有 attr (屬性)、drawable (圖片、圖示)、id (識別符號)、layout (介面描述)、string (文字) 這幾種資源型態,就 XML 描述檔中的 id 來說,開發工具會根據 XML 描述檔中指定的 id,生成對應的資源,並自動指定一個位址。 Google 官方文件是這麼解釋「R.java」檔案的作用的: A project's R.java file is an index into all the resources defined in the file. You use this class in your source code as a sort of short-hand way to refer to resources you've included in your project. This is particularly powerful with the code-completion features of IDEs like Eclipse because it lets you quickly and interactively locate the specific reference you're looking for. The important thing to notice for now is the inner class named "layout", and its member field "main". The Eclipse plugin noticed that you added a new XML layout file and then regenerated this R.java file. As you add other resources to your projects you'll see R.java change to keep up. 有了「R.java」做中介,在 XML 描述檔中,我們可以透過 @[類型]/[識別符號] 這樣的語法來為某個介面元件提供識別符號,以供程式控制。 例如,我們可以用 「@+id/height」來為對應供輸入身高數字的 EditText 元件提供識別符號。 將字串抽離 XML 當我們在 res 資料夾中新增各種一個 XML 檔案,或是一張圖片時,開發工具會從 res 資料夾中蒐集,並將各種資源彙整成一個索引,自動產生出 R.java 檔。 透過這個特性,我們可以進一步加工我們的 XML 描述檔,讓介面更易於維護。 開啟 res/values/strings.xml 原始的內容為 &lt;?xml version="1.0" encoding="utf-8"?&gt; <resources> <string name="app_name">BMI</string> </resources> 裡面只定義了一個字串「app_name」,用來表示應用程式名稱(在之後講解 AndroidManifest.xml 檔案時將會用到)。 我們看到表示字串的格式為 <string name="識別代號">文字敘述</string> 我們將上一章中的敘述抽取出來,整理進 strings.xml 檔案。 完整的 strings.xml 檔案如下: &lt;?xml version="1.0" encoding="utf-8"?&gt; <resources> <string name="app_name">BMI</string> <string name="bmi_height">身高 (cm)</string> <string name="bmi_weight">體重 (kg)</string> <string name="bmi_btn">計算 BMI 值</string> <string name="bmi_result">你的 BMI 值是 </string> </resources> 在 strings.xml 檔案中,我們在原本的 app_name 字串外,自行定義了另外幾個字串。如果我們再次開啟 「R.java」檔,我們會發現檔案中的 string 類別中也自動索引了上面定義好的字串: public static final class string { public static final int app_name=0x7f040000; public static final int bmi_btn=0x7f040003; public static final int bmi_result=0x7f040004; public static final int bmi_height=0x7f040001; public static final int bmi_weight=0x7f040002; } 接著,我們把這些字串應用到之前定義好的 XML 描述檔中。透過使用 @string/[識別符號] 這樣存取 string 類型的格式,來取代 main.xml 檔案中原本寫死的文字敘述。 完整的程式碼如下: &lt;?xml version="1.0" encoding="utf-8"?&gt; <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/bmi_height" /> <EditText android:id="@+id/height" android:layout_width="fill_parent" android:layout_height="wrap_content" android:numeric="integer" android:text="" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/bmi_weight" /> <EditText android:id="@+id/weight" android:layout_width="fill_parent" android:layout_height="wrap_content" android:numeric="integer" android:text="" /> <Button android:id="@+id/submit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/bmi_btn" /> <TextView android:id="@+id/result" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <TextView android:id="@+id/suggest" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> </LinearLayout> 再次運行 Android 虛擬機器,我們看到與前一節完全相同的介面。但就介面而言,透過將描述字串統一集中在 「string.xml」 中,我們以後要修改介面時更有彈性了。 至此我們已經完成了 BMI 應用程式負責「顯示 (View)」的部份。 新增 XML 檔案 我們在前面都只修改到開發工具幫我們產生的檔案, 而事實上,我們所有在 「res」 目錄中所做的修改,開發工具都會自動搜尋,將之整理到「R.java」中。因此我們也可以在「src/values」中建立自己的文字描述檔案。 我們這就在「res/values」目錄中建立一個 「advice.xml」檔,裡面將包含 BMI 程式算出 BMI 值後將給予的建議文字,完整的檔案如下: &lt;?xml version="1.0" encoding="utf-8"?&gt; <resources> <string name="advice_light">你該多吃點</string> <string name="advice_average">體型很棒喔</string> <string name="advice_heavy">你該節食了</string> </resources> 打開「R.java」檔,我們發現「advice_light」、「advice_average」、「advice_heavy」也已整理進「R.java」檔的索引中,以供程式調用。 Android 中所有的資源檔案(圖片、XML等)命名都必須使用英文小寫,檔名中間只允許加上底線「」符號。其他的檔名都會造成無法正常產生R.java 檔,讓你的程式無法編譯。 那麼接下來,我們就開始進入到了解 Android 程式流程的部分吧。 AndroidLogic 解讀程式流程 接著要觀察主要程式邏輯的內容囉。打開 「src/com/demo/android/bmi」 目錄下的 「Bmi.java」檔案,Eclipse+Android 開發工具已經幫我們預先建立好了基本的程式邏輯。其預設的內容如下: 1 package com.demo.android.bmi; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 6 public class Bmi extends Activity { 7 /** Called when the activity is first created. */ 8 @Override 9 public void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.main); 12 } 13 } 講解 比起什麼標籤都對稱的 XML 介面描述檔來說,這個以 Java 程式語言寫成的檔案雖然篇幅短,但反而要難讀得多。 我們將程式直接拆開,分成幾個部份來講解這個「Bmi.java」 檔案的內容: 第 1 行: package com.demo.android.bmi; 這一行的作用是指出這個檔案所在的名稱空間。「package」(套件)是其關鍵字。使用名稱空間的原因是程式一旦擴展到擴展到某個大小,程式中的變數名稱、方法名稱、類別名稱難免重複, 這時就可以將定義的名稱區隔管理在 package 下,以避免相互衝突的情形發生。Java 的 package 設計成與檔案系統結構相對應,如我們的 package 設定是 「package com.demo.android.bmi」,則這個類別就該在指定目錄的「com/demo/android/bmi」路徑下可以找到。 同時也別忘了 Java 程式語言每段敘述語句的結尾處,與大部分的程式語言一樣需加上一個分號「;」,以表示一行程式敘述的結束。 第 3,4 行: import android.app.Activity; import android.os.Bundle; 程式中預設導入了 「android.app.Activity」跟「android.os.Bundle」兩個 Package,在所有的 Android 應用程式中都會用到這兩個 Package。「import」(導入)是用作導入 Package 的關鍵字。在 Java 語言中,使用到任何 API 前都要事先導入相對應的 Package。我們馬上將學到這兩個 Package 的用途。 Android 支援的 Package 與標準的 Java(j2se) 不盡相同。在寫 Android 應用程式時,你偶而可能需要參考可用的 API 列表,以確認使用到的 Package 是否有內建支援。後續章節中也將講解如何透過新增「jar」檔來呼叫額外的 Package。 完整的 API 可查閱官方的 package 列表: http://code.google.com/android/reference/packages.html 第 6,13 行: public class Bmi extends Activity { } 第6行開始了程式的主體。其組成是這樣的: public class Bmi 「Bmi」是這個類別的名稱。「class」則是用作宣告類別關鍵字。「public」關鍵字是用來修飾「Bmi」這個類別。表示「Bmi」是個「公開」的類別,可以從 package 外部取用。 「public class Bmi」後面再加上「extends Activity」敘述,則表示 「Bmi」 這個類別的功能、型別等全繼承自「Activity」類別。「extends」是繼承(Inherit)類別的關鍵字。「Activity」是來自於我們在第3行剛導入的Package。 因此整句話的含意即:「宣告一個公開的 Bmi 類別。這個 Bmi 類別繼承了程式開頭導入的 Activity 類別」。 「{}」大括號規範了一個程式區塊。大括號中的程式表達的這個程式區塊的主要內容。 第 7 行: /** Called when the activity is first created. */ 第 7 行提供了位於其下的函式的註釋。「/* */」 是 Java 語言的多行註解符號,位於其中的文字內容不會被編譯。「/*」敘述後多出來的一個「*」號被視為內文。順便提醒一下,Java 程式語言中兩個斜線「//」表示的是單行註解符號。單行註解符號「//」與多行註解符號「/* */」不同的地方是,只有與「//」符號同行的文字才不會被編譯。 第 8-9, 12 行: @Override public void onCreate(Bundle savedInstanceState) { } 第9行開始了這個方法(Method)的主體。其組成是這樣的: public void onCreate(Bundle savedInstanceState) { } 「onCreate」是這個方法的名稱。「void」則是宣告了這個方法的回傳值的型別(type)。「public」關鍵字是用來修飾「onCreate」這個方法。表示「onCreate」是個「公開」的方法,可以由 bmi 類別外部取用。 方法的回傳值的型別,即是這個方法的型別。「onCreate」這個方法使用「void」型別,表示「onCreate」這個方法不需回傳值。 同時,這個方法傳入了一個名為「savedInstanceState」的「Bundle」型別參數,「Bundle」型別正是來自我們前面所導入的 Package 之一。我們並不需要知道太多「Bundle」型別或「savedInstanceState」實體的細節,只要知道「Bundle」的內容與手機平台的記憶體管理有關。 當 Android 應用程式啟動、換到背景等待、關閉時,都會用到 「savedInstanceState」 這個實體來處理記憶體相關的事宜。當然,你也可以用其他名稱來代替它。還好「onCreate」這個方法永遠都是傳入「Bundle savedInstanceState」這個參數,寫應用程式時只要正確照規定傳入即可,你可以不用太去在意它。 給對 Bundle 是什麼有興趣的讀者: 「Bundle」可以保存程式上一次關閉(凍結)時的狀態。你可以透過覆寫 onFreeze 方法(與 onCreate 方法的作用類似) 來保存凍結前的狀態。 當程式啟動(Activity 重新初始化)時,會再次呼叫 onCreate 方法,你就能從 savedInstanceState 中得到前一次凍結的狀態。我們也可以透過「Bundle」來將這個 Activity 的內容傳到下一個 Activity 中。 之後講 Activity 時,也會講解 onCreate/onFreeze 等方法的關係。 「{}」大括號規範了一個程式區塊。大括號中的程式表達 onCreate 這個程式區塊的主要內容。 @Override public void onCreate(Bundle savedInstanceState) 從前面的講解中,我們學到了在任何一個 Android 專案目錄裡,只要打開「Referenced Libraries」 目錄的「android.app」 分類,都可以找到 「Activity.class」這個類別。現在我們再深入一些查看「Activity.class」 類別。你要做的,只是依照圖示,找到 Android 工具中的「Referenced Libraries」 目錄,從「android.app」 分類裡找到「Activity.class」類別,並按下「Activity.class」 類別左側的三角形圖示,如此即可展開這個類別的屬性/方法列表。 我們在Activity類別的屬性/方法列表中,發現了現在正要講解的 onCreate 方法(Method)。 因為「bmi」 類別繼承自 Activity 類別,所以預設「bmi」 類別中其實已經有「onCreate」方法了。 事實上,「onCreate」 方法正是每個 Activity 類別初始化時都會去呼叫的方法。「@」開頭的語句表示裝飾子(decorator)語句,「@Override」語句的作用是告訴程式我們要覆寫這個「onCreate」方法。當我們打開程式時,程式不再使用從「bmi」 類別中繼承來的「onCreate」方法,而是使用我們在程式中自訂的行為。 @Override public void onCreate(Bundle savedInstanceState) { } 我們講解了整段程式,其含意是「覆寫 bmi 類別中公開的 onCreate 方法。這個 「onCreate」 方法無回傳值型別,而且這個方法傳入了一個名為 「savedInstanceState」 的 Bundle 型別參數。 現在來看看「onCreate」方法中包含的程式內容。 第 10, 11 行: super.onCreate(savedInstanceState); 「super」是關鍵字。代表著這個 「Bmi」 類別的上層類別(Activity)。「super.onCreate(savedInstanceState);」的意思就是:「執行 Activity 類別中 onCreate 方法的內容」。這麼做的目的是什麼呢? Google Android 將其應用程式的介面稱為視圖(View),而負責控制各種動作行為的程式主體(Controller),則稱為活動(Activity)。因此一個 Android 應用程式,必定會對應到一個以上的 Activity。 「onCreate」 方法則是每個 Activity 類別初始化時都會去呼叫的方法。我們想做的事,是保持原本「onCreate」 方法預設的動作,然後在其中加入我們想要的內容。 而 Android 產生的程式預設卻覆載(@Override)了「Bmi」 類別的「onCreate」 方法。原本繼承自 「Activity」類別的「onCreate」方法,其原本內容都被覆載掉了。因此想將原本的「onCreate」方法內容保留,並在其中加入我們的內容的話,就要使用「super」語句。當程式運行到我們覆寫的「onCreate」 方法時,透過「super.onCreate(savedInstanceState);」語句,會先將原本「Activity」類別中的「onCreate」方法執行一次,然後再執行我們覆寫的「onCreate」方法裡面其他的程式內容。 我們要執行原本的「onCreate」 方法時,仍然需要

2012-02-16

免费下载-Android 开发环境搭建步骤详细图解

免费下载-Android 开发环境搭建步骤详细图解 Android 网络资源 Android的网站是:http://www.android.com/,目前还可以登陆,比较悲剧的是:其Partners部分:http://source.android.com/和Developers部分:http://developer.android.com/,大陆地区已经无法访问。 Android的系统要求请参考:http://androidappdocs.appspot.com/sdk/requirements.html 当前最新版本的Android SDK下载器(真正的SDK还是需要另外下载的),小生是无法直接到官网http://developer.android.com/sdk/index.html 下载的,于是另外找了一个地址http://androidappdocs.appspot.com/sdk/index.html,下载链接和说明如下: Android SDK for Windows android-sdk_r08-windows.zip http://dl.google.com/android/android-sdk_r08-windows.zip installer_r08-windows.exe (Recommended) http://dl.google.com/android/installer_r08-windows.exe Android SDK for Mac OS X (intel) android-sdk_r08-mac_86.zip http://dl.google.com/android/android-sdk_r08-mac_86.zip Android SDK for Linux (i386) android-sdk_r08-linux_86.tgz http://dl.google.com/android/android-sdk_r08-linux_86.tgz Here's an overview of the steps you must follow to set up the Android SDK: 1. Prepare your development computer and ensure it meets the system requirements. 2. Install the SDK starter package from the table above. (If you're on Windows, download the installer for help with the initial setup.) 3. Install the ADT Plugin for Eclipse (if you'll be developing in Eclipse). 4. Add Android platforms and other components to your SDK. 5. Explore the contents of the Android SDK (optional). 1 no Pain no Gain no Gavin 博客同步更新至:http://blog.sina.com.cn/deaboway http://blog.csdn.net/deaboway 3. 软件包下载 a. JDK 1.6 下载网址: http://www.oracle.com/technetwork/java/javase/downloads/index.html 当前最新版本为Java SE 6 Update 23 小生机器上安装的是:jdk1.6.0_21,也一样用,其实只要你是JDK1.5以上就可以了。 b. Android SDK下载器 下载地址上面已经给出了,可以根据你的系统选择不同的安装包。小生是windows 2003 server,因此下载了http://dl.google.com/android/android-sdk_r08-windows.zip,之后直接解压缩即可。 c. Eclipse IDE Eclipse 3.4 (Ganymede)以后版本均可。小生下载了最新版本的Helios (3.6) 二、 JAVA环境 Windows上配置JAVA环境变量如下:

2012-02-16

免费下载-Android SDK 中文开发文档

免费下载-Android SDK 中文开发文档 什么是Android? Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。Beta版的Android SDK 提供了在Android 平台上使用JaVa语言进行Android应用开发必须的工具和API接口。 特性 · 应用程序框架支持组件的重用与替换 · Dalvik 虚拟机专为移动设备优化 · 集成的浏览器基于开源的WebKit 引擎 · 优化的图形库包括定制的2D图形库,3D图形库基于OpenGL ES 1.0 (硬件加速可选) · SQLite 用作结构化的数据存储 · 多媒体支持包括常见的音频、视频和静态图像格式(如MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF) · GSM 电话技术(依赖于硬件) · 蓝牙 Bluetooth, EDGE, 3G, 和WiFi (依赖于硬件) · 照相机,GPS,指南针,和加速度计(accelerometer) (依赖于硬件) · 丰富的开发环境包括设备模拟器,调试工具,内存及性能分析图表,和Eclipse集成开发环境插件 Android 架构 下图显示的是Android操作系统的主要组件。每一部分将会在下面具体描述。

2012-02-16

Android2.3用户手册.pdf

Android2.3用户手册.

2012-02-16

全套源码 C#天津二中图书馆 管理系统.

全套源码 C#天津二中图书馆 管理系统.

2012-02-16

全套源码-C#3.5医院管理系统 含数据库

全套源码-C#3.5医院管理系统

2012-02-16

全套源码含DB C#人力资源管理系统

全套源码含DB C#人力资源管理系统

2012-02-16

全套源码 C#实现的家庭财务系统,学习C#比较好的案例

全套源码 C#实现的家庭财务系统,学习C#比较好的案例

2012-02-16

全套源码-即时通信系统(Java实现)

全套源码-即时通信系统(Java实现)

2012-02-16

全套源码-聊天室 ActionScript 3.0实现

聊天室 ActionScript 3.0

2012-02-16

全套源码-某电子购物商城系统(C#实现)含数据库

全套源码-某大型电子购物商城系统(C#实现)含数据库

2012-02-16

全套源码-论坛系统(Struts 2+Hibernate+Spring实现)

全套源码-论坛系统(Struts 2+Hibernate+Spring实现)

2012-02-16

全套源码,校友录系统(ASP.NET 3.5实现)含数据库

全套源码,校友录系统(ASP.NET 3.5实现)含数据库

2012-02-16

源码-自动点滴管理系统(.NET 3.5框架的WCF技术实现

源码-自动点滴管理系统(.NET 3.5框架的WCF技术实现 全套源码奉献 学习WCF的好项目参考。 服务器端 和 客户端,全套

2012-02-16

自助型教程:破解无线网络密码[有图+详解

犹豫什么赶快来下吧 ===================================== 自助型教程:破解无线网络密码[有图+详解 看看你也会,自己动手破解无线网密码,无论在哪儿都能无线上网了。 ----------- 犹豫什么赶快来下吧 免费哦 !

2012-02-16

牛B网络技术资料大

牛B网络技术资料大,很多很多,收藏必备

2012-02-16

C#经典Demo35个免费下载

C#经典Demo35个免费下载、

2012-02-16

C#源码做的新浪博客采集器,仅供C#学习用

C#源码做的新浪博客采集器,仅供C#学习用

2012-02-16

针对IE67FF的兼容CSS编码 免费下载

针对IE67FF的兼容CSS编码 免费下载

2012-02-16

.NET中 指定文件夹生成 免费下载

.NET中 指定文件夹生成

2012-02-16

ASPX.NET中 GridView_按钮事件绑定 免费下载

ASPX.NET中 GridView_按钮事件绑定 免费下载

2012-02-16

C#文件删除 免费下载

C#文件删除 免费下载

2012-02-16

LINQ 中模糊查询 免费下载

LINQ 中模糊查询 免费下载

2012-02-16

。NET经典技术

程序的学习是一个循序渐进的过程,一些常用的或经典代码应该保存下来以便日后使用。本文就给出一些.net的经典代码,希望对大家有所帮助……   1.弹出对话框.点击转向指定页面   Response.Write("");   Response.Write("");   2.弹出对话框   Response.Write("");   3.删除文件  string filename ="20059595157517.jpg"; pub.util.DeleteFile&#40;HttpContext.Current.Server.MapPath("../file/"&#41;+filename);   4.绑定下拉列表框datalist System.Data.DataView dv=conn.Exec_ex("select -1 as code,'请选择经营模式' as content from dealin union select code,content from dealin");   this.dealincode.DataSource=dv;   this.dealincode.DataTextField="content";   this.dealincode.DataValueField="code";   this.dealincode.DataBind();   this.dealincode.Items.FindByValue(dv[0]["dealincode"].ToString()).Selected=true;   5.时间去秒显示 <%# System.DateTime.Parse(DataBinder.Eval&#40;Container.DataItem,"begtime"&#41;.ToString()).ToShortDateString()%>   6.标题带链接 <%# "<a class="12c" target="_blank" href="http://www.webjx.com/CV/_">"+ DataBinder.Eval&#40;Container.DataItem,"proname"&#41;+"</a>"%>   7.修改转向 <%# "<A href="editpushpro.aspx?id=">"+"修改"+"</A>"%>   8.弹出确定按钮 <%# "<A id="btnDelete" href="pushproduct.aspx?dl=">"+"删除"+"</A>"%>   9.输出数据格式化 "{0:F2}" 是格式 F2表示小数点后剩两位 <%# DataBinder.Eval&#40;Container, "DataItem.PriceMoney","{0:F2}"&#41; %>   10.提取动态网页内容   Uri uri = new Uri("http://www.webjx.com/");   WebRequest req = WebRequest.Create(uri);   WebResponse resp = req.GetResponse();   Stream str = resp.GetResponseStream();   StreamReader sr = new StreamReader(str,System.Text.Encoding.Default);   string t = sr.ReadToEnd();   this.Response.Write(t.ToString()); 11.获取" . "后面的字符   i.ToString().Trim().Substring(i.ToString().Trim().LastIndexOf(".")+1).ToLower().Trim()   12. 打开新的窗口并传送参数:   传送参数:   Button1.Attributes.Add("onclick","return confirm('确认?')"); button.attributes.add("onclick","if(confirm('are you sure...?')){return true;}else{return false;}")   接收参数:   string a = Request.QueryString("id");   string b = Request.QueryString("id1");   13.为按钮添加对话框   Button1.Attributes.Add("onclick","return confirm('确认?')");   button.attributes.add("onclick","if(confirm('are you sure...?')){return true;}else{return false;}")   14.删除表格选定记录   int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex];   string deleteCmd = "Delete from Employee where emp_id = " + intEmpID.ToString()   15.删除表格记录警告   private void DataGrid_ItemCreated(Object sender,DataGridItemEventArgs e)   {   switch(e.Item.ItemType)   {   case ListItemType.Item :   case ListItemType.AlternatingItem :   case ListItemType.EditItem:   TableCell myTableCell;   myTableCell = e.Item.Cells[14];   LinkButton myDeleteButton ;   myDeleteButton = (LinkButton)myTableCell.Controls[0];   myDeleteButton.Attributes.Add("onclick","return confirm('您是否确定要删除这条信息');");   break;   default:   break;   }   }   16.点击表格行链接另一页   private void grdCustomer_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)   {   //点击表格打开   if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)   e.Item.Attributes.Add("onclick","window.open('Default.aspx?id=" + e.Item.Cells[0].Text + "');");   }   双击表格连接到另一页   在itemDataBind事件中   if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)   {   string orderItemID =e.item.cells[1].Text;   e.item.Attributes.Add("ondblclick", "location.href='../ShippedGrid.aspx?id=" + orderItemID + "'");   }   双击表格打开新一页   if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)   {   string orderItemID =e.item.cells[1].Text;   e.item.Attributes.Add("ondblclick", "open('../ShippedGrid.aspx?id=" + orderItemID + "')");   }   16.表格超连接列传递参数   <asp:HyperLinkColumn Target="_blank" headertext="ID号" DataTextField="id" NavigateUrl="aaa.aspx?id=' <%# DataBinder.Eval&#40;Container.DataItem, "数据字段1"&#41;%>' & name='<%# DataBinder.Eval&#40;Container.DataItem, "数据字段2"&#41;%>' />   17.表格点击改变颜色 if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)   {   e.Item.Attributes.Add("onclick","this.style.backgroundColor='#99cc00';   this.style.color='buttontext';this.style.cursor='default';");   }   写在DataGrid的_ItemDataBound里 if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)   {   e.Item.Attributes.Add("onmouseover","this.style.backgroundColor='#99cc00';   this.style.color='buttontext';this.style.cursor='default';");   e.Item.Attributes.Add("onmouseout","this.style.backgroundColor='';this.style.color='';");   }   18.关于日期格式   日期格式设定   DataFormatString="{0:yyyy-MM-dd}"   我觉得应该在itembound事件中 e.items.cell["你的列"].text=DateTime.Parse(e.items.cell["你的列"].text.ToString("yyyy-MM-dd"))   19.获取错误信息并到指定页面   不要使用Response.Redirect,而应该使用Server.Transfer   // in global.asax   protected void Application_Error(Object sender, EventArgs e) {   if (Server.GetLastError() is HttpUnhandledException)   Server.Transfer("MyErrorPage.aspx");   //其余的非HttpUnhandledException异常交给ASP.NET自己处理就okay了 :)   }   Redirect会导致post-back的产生从而丢失了错误信息,所以页面导向应该直接在服务器端执行,这样就可以在错误处理页面得到出错信息并进行相应的处理   20.清空Cookie   Cookie.Expires=[DateTime];   Response.Cookies("UserName").Expires = 0 21.自定义异常处理   //自定义异常处理类   using System;   using System.Diagnostics;   namespace MyAppException   {   ///   /// 从系统异常类ApplicationException继承的应用程序异常处理类。   /// 自动将异常内容记录到Windows NT/2000的应用程序日志   ///   public class AppException:System.ApplicationException   {   public AppException()   {   if (ApplicationConfiguration.EventLogEnabled)LogEvent("出现一个未知错误。");   }   public AppException(string message)   {   LogEvent(message);   }   public AppException(string message,Exception innerException)   {   LogEvent(message);   if (innerException != null)

2012-02-16

Linq求最值 免费下载

Linq求最值 免费下载

2012-02-16

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除