一. 建立首个应用
文章目录
废话不多说,要开始开发一个android应用,首先要做好准备工作. 本文是建立在Windows8下Eclipse IDE环境. 话说以前我连什么是SDK都不知道,现在给自己记下SDK是软件开发工具包(Software Development Kit).
- 下载Android SDK.
- 安装Eclipse的ADT插件(一般都用Eclipse).
- 使用SDK管理器下载最新的SDK工具和平台
关于要配置JDK环境,我在android training里没找到,但是网上说要配置. 我猜是现在的Eclipse已经集成了JDK环境,无须重新配置. 当然我年少无知地配置了, 不知道是否必要. 关于android的准备工作,网上一查一大推,肯定可以配置成功. 这里不详细展开.
1.建立一个Android项目
- 打开Eclipse,点击File->New->Android Application Project,出现图1界面
- Application Name ,应用名,随便填,就是出现在手机的那个名字.当然刚开始老实点填My First App
- Project Name项目名,随便,而且你填了应用名,会自动帮你生成个名字.
- Package Name包名,是你应用的包命名空间(跟Java一个规则).包名必须在Android中唯一.
- Minimum Required SDK最低SDK要求,就是说你想不想兼容一下版本,比如你选了最新的android4.4,即API19,那么android4.4以下版本就无法运行.为了支持更多的设备,当时是设低点好,但是,android 4 和android 2是在差了太多,我想没人想支持4.0以下的设备,只是市场还是有太多android 2的占有率,开发者只能被迫去兼容.
- Target SDK目标SDK,用来表明Android的最新版本,这样可以使用新的特性,以支持新设备
- Compile With通过…编译,你要用哪个API编译你的应用.一般默认最新API.
- Theme主题.有None,Holo Light, Holo Dark,Holo Light with Dark action bar.
- 下一步,设置图标,默认就行.
- 下一步,设置个活动模板,选择BlankActivity空活动
还有"通过命令行创建项目"我不写了,那是大牛的事.
2.运行你的App
android的空项目,竟然不是真正的空项目,而是默认包含了显示"Hello World!“的功能. 首先了解下android项目的目录结构和文件.
AndroidManifest.xml
该文件描述应用的基本性能.一个其中重要的元素是,里面包括 android:minSdkVersion 和 android:targetSdkVersion 属性. 具体的要去这里看
src/
主要源文件的目录,一般包括一个活动类
res/
包含一些应用资源,如drawable_hdpi/, layout/ , values/ 等.详细的说明不表,可以查到
android的空项目,竟然不是真正的空项目,而是默认包含了显示"Hello World!“的功能.
在真实设备上运行
如果你有android设备,那么
- 安装你设备的windows驱动.不懂戳这里
- 允许你设备的USB调试
运行应用 点击Run –>Run as Android Application –>OK
在模拟器上运行
如果你没有android设备,可以使用android虚拟机Android Virtual Device (AVD). 创建一个AVD
- 打开eclipse中的Android Virtual Device Manager
- 点击New ,然后输入名字, 平台目标,SD卡大小,屏幕大小等
- 点 Create AVD
- 选择这个AVD并点 Start
- 当模拟器启动,解锁模拟器屏幕
然后在Eclipse运行应用,点击Run –>Run as Android Application –>OK
3.构建一个简单的用户界面
Android应用的GUI的构建需要用到View和ViewGroup对象的层级.对象view通常用于UI小部件,如按钮和文本域.而对象ViewGroup是不可见的视图容器,用来定义子视图如何布局. Android提供XML词汇表(vocabulary),它与 View 和 ViewGroup的子类相匹配,能让你在XML里使用UI元素的层级来定义你的UI.
在本教程中,你将会创建一个XML格式的布局(layout),其中包含一个文本域和一个按钮.一下课程中,按下按钮时需要响应,响应的内容是将文本域的内容发动到另一个活动(activity).
创建一个线性布局
在res/layout/directory 目录下打开activity_main.xml文件 注意: 在Eclipse,当你打开layout文件,你先会看到图形布局界面,本课程需要你切换到xml文件. 当你创建项目时选择的空活动(BlankActivity)模板包括 activity_main.xml
文件 首先,删除元素,并改变[<RelativeLayout>](http://developer.android.com/reference/android/widget/RelativeLayout.html)
为[<LinearLayout>](http://developer.android.com/reference/android/widget/LinearLayout.html)
. 然后增加android:orientation 属性并设置为"horizontal”.结果如下
|
|
LinearLayout是视图组用以展示子视图在水平或垂直方向,这通过android:orientation属性指定. LinearLayout的每个孩子都会按XML的顺序出现在屏幕上 其他两个属性 android:layout_width 和 android:layout_height 用来改变大小的. 因为LinearLayout是布局里的根视图,所以它应该填充整个屏幕区域.这通过将width和height设为"match_parent”.这个值声明,这个视图应扩展(expand)到与父视图一样的宽高. 想知道更多layout属性,见Layout
添加文本域
增加可编辑的文本域,需要在<LinearLayout>
添加元素. 以下是你如何声明<EditText>
|
|
关于这些属性
它提供为视图唯一的标示符(identifier). 当你指向任何XML里的资源,你需要符号(@).他后面跟着资源类型(这里是id),一个斜线,然后资源名(edit_message). 仅当你第一次定义资源ID时需要加号(+).当你编译这个应用时,SDK会使用这个ID创建一个新资源ID在你的项目的gen/R.java 文件中,这个ID指向EditText元素.一旦资源ID被声明,其他对该ID的引用无须加号.
android:layout_width 和 android:layout_height
“wrap_content"属性指定视图应该足够容得下所有内容.如果你用"match_parent"代替之,那么EditText元素将会填充屏幕,因为他将匹配他父亲LinerLayout的大小.
这是当文本域为空时默认显示的字符串. 代替使用一个硬编码字符串作为值, “@string/edit_message"值指向在不同的文件中一个字符串资源. 因为这指向一个集中的资源,它不需要加号. 然而,因为你还没定义string资源,你会看到编译错误.你需要下一步进行改正.
添加String资源
当你需要在用户界面增加文本时,你需要制定每个字符串作为一个资源. 字符串资源允许你在一个位置管理所有的UI文本,这将变得容易找到和更新文本.外化(Externalizing)字符串允许你提供每个字符串资源的多种定义,并以不同的语言来本地化你的应用, 默认下,你的Android项目包含字符串资源在res/values/strings.xml目录下. 添加一个字符串名(name)叫"edit_message”,值为"Enter a message.” 同时,增加一个"Send",名字(name)叫"button_send"
|
|
更多关于使用字符串资源对于不同的语言本地化你的应用,参见Supporting Different Devices
添加按钮
增加一个<Button>
到布局,紧接在<EditText>
后面.
|
|
高度和宽度设为"wrap_content",以至于按钮的大小决定于按钮的文本. 这个按钮不需要android:id属性,因为他不会被这个活动引用.
使输入框匹配屏幕宽度
这个布局目前设计成EditText和Button控件仅仅只有容下他们的内容的大小
看起来按钮正常,但文本域不好,有点短.这时可以改变LinearLayout里的weight属性
|
|
为了提升效率,应该将EditText的width设为0. 因使用"wrap_content"会让系统进行计算 ,而这计算是毫不相关的,因为权值需要其他宽度计算来填充剩余空间.
|
|
|
|
这个布局通过默认的Activity类进行应用,当项目创建的时候,SDK工具可以直接生成,你可以运行应用查看结果
4.开始另一个活动
上个课程,教你显示一个带有文本域和按钮的活动. 本课将增加一些代码到 MainActivity 中,使用户点击Send 按钮使,启动另一个新活动.
对Send按钮的回应(Respond)
为了回应按钮的一次点击事件, 打开activity_main.xml 布局文件, 并增加 android:onClick
属性到<Button>
.
|
|
android:onClick
的属性值"sendMessage"是你活动中的方法(Method)的名字,当用户点击按钮时,系统需要调用到的方法. 打开 MainActivity 类,并增加以下方法:
/** Called when the user clicks the Send button */ public void sendMessage(View view) { // Do something in response to button }
这时需要导入(import) View类
import android.view.View;
**技巧:**在Eclipse中, 按Ctrl+Shift+O 可以导入缺失的类. 为了让系统匹配这个方法到android:onClick, 名字应该正确地显示.特别地,方法应该:
- 公有的
- 有个空(void)的返回值
- 有个视图作为唯一的参数
接下来, 你将完成这个方法, 来读取文本域的内容并将内容发送给另一个活动.
建立一个目的(Intent)
目的(Intent)是一个在不同组件(例如两个活动)间提供运行时绑定(runtime binding)的对象.Intent代表app"打算做什么".你可以使用目的完成各种各样的任务,但是大多数情况下,它们用于启动另一个活动. 在sendMessage()
方法中, 创建一个Intent来启动一个叫DisplayMessageActivity
的活动.
|
|
这个构造函数包含两个参数:
- Context作为它的第一个参数(使用this是引文Activityclass是Context的子类)
- 系统应该传递(deliver)这个Intent到app组件的类,(假若如此,这个活动应该被启动)
注意: 如果你使用一个诸如Eclipse的IDE, 那么对DisplayMessageActivity
的引用会引发一个错误,因为这个类还不存在.暂时忽视这个错误,稍后你会创建这个类. 目的不仅仅允许你启动另一个活动,也能传输一堆数据到这个活动. 在sendMessage()
方法中, 使用findViewById()
来获得EditText元素,并添加文本值到这个目的:
|
|
注意: 你需要导入声明android.content.Intent
和android.widget.EditText
. 你需要马上定义EXTRA_MESSAGE常量. Intent能携带许多各种数据类型作为键值对(key-value pairs),也叫extras. putExtra()方法以键名作为第一个参数,键值作为第二个参数. 为了下一个活动查询额外数据,你需要额外使用一个公共常量来为你的intent的定义关键字.那么添加EXTRA_MESSAGE
定义到MainActivity
类的顶部.
|
|
额外使用你的app包的名字作为前缀来定义关键字,这通常来说是个很好的做法.假如你的app与其他app交互,这保证它们的唯一性,
启动第二个活动
开始一个活动,调用startActivity() 并传递到你的Intent. 系统接收这个调用然后启动一个由Intent指定活动的实例. 假如新代码,完整的包含Send按钮的sendMessage()
方法如下:
|
|
现在你需要创建DisplayMessageActivity
类来让它运行
创建第二个Activity
点击工具栏的 New
然后在新窗口打开 Android 文件夹 并选择 Android Activity. 点击Next.
选择BlankActivity 并点击Next.
填写活动的详情:
- Project: MyFirstApp
- Activity Name: DisplayMessageActivity
- Layout Name: activity_display_message
- Title: My Message
- Hierarchial Parent: com.example.myfirstapp.MainActivity
- Navigation Type: None
点击 Finish.
打开DisplayMessageActivity.java
文件,如果你使用Eclipse创建这个活动
- 这个类已经包含所需onCreate()方法的实现.
- 也包含 onCreateOptionsMenu()方法的实现,不过这里不需要,可以删去.
- 也包含 onOptionsItemSelected()方法的实现,它控制工具栏的Up behavior的行为,保留不变.
因为ActionBar API仅在HONEYCOMB(API level 11)或更高的版本上有效,所以你需要增加一个条件来检查目前平台版本. 另外,你需要增加@SuppressLint("NewApi")
标签到onCreate()方法来避免lint错误. DisplayMessageActivity
类应如下所示:
|
|
Activity所有的子类必须执行onCreate()方法. 当创建一个活动的实例时, 系统调用它. 这个方法你必须用setContentView()方法来定义该活动布局.而且该方法你应该为活动组件执行最初的设置.
添加标题字符串
如果使用Eclipse, 你可以跳过这个步骤. 因为模板为新的活动提供了标题字符串,显示如下:
|
|
添加到manifest
所有的活动必须在你的manifest中声明,AndroidManifest.xml
,使用元素 当你使用Eclipse工具创建活动,会创建一个默认的条目.如下所示:
|
|
属性android:parentActivityName
声明这个活动的父(parent)活动的名字在app的逻辑层级(logical hierarchy)之内. 系统使用这个值来实现默认的导航行为, 例如Up navigation在Android 4.1(API level 16)或更高. 你可以通过使用 Support Library 和添加<meta-data>
元素,为老版本的Android提供相同的导航行为. 注意: 你的Android SDK应该已经包含最新的Android Support Library. 它包含在ADT Bundle中. 当 Support Library使用Eclipse中的模板, Support Library自动被添加到你的app工程(你能看到library’s JAR文件列在 Android 依赖关系(Dependencies)中). 如果你用Eclipse进行开发, 你现在能够运行这个app了,但是没什么结果. 点击 Send按钮启动第二个活动,但是它使用模板提供的默认的"Hello world"布局.你即将更新这个活动代替为显示一个自定义的文本视图.
接收(receive)目的
每个Activity都是被Intent调用, 不管用户如何操控. 你可以通过调用getIntent()获得Intent用来启动你的活动和检索(retrieve)包含其中的数据 在DisplayMessageActivity
类的onCreate()方法中,获得目的和提取由MainActivity
传递的消息.
Intent intent = getIntent(); String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
显示消息
为了在屏幕上显示信息,创建一个TextView
控件并使用setText()
设定文本.然后增加TextView
作为这个活动布局的根视图,通过传递它到setContentView()
. DisplayMessageActivity
下完整的onCreate()
方法如下:
|
|
你现在可以运行app了, 当它打开, 在文本域输入消息, 点击Send按钮, 然后消息就出现在第二个活动中. 就是这样,你已经生成了你的第一个安卓应用! 想学更多,跟着来
文章作者 fdx
上次更新 2013-12-07