废话不多说,要开始开发一个android应用,首先要做好准备工作. 本文是建立在Windows8下Eclipse IDE环境. 话说以前我连什么是SDK都不知道,现在给自己记下SDK是软件开发工具包(Software Development Kit).

  1. 下载Android SDK.
  2. 安装EclipseADT插件(一般都用Eclipse).
  3. 使用SDK管理器下载最新的SDK工具和平台

关于要配置JDK环境,我在android training里没找到,但是网上说要配置. 我猜是现在的Eclipse已经集成了JDK环境,无须重新配置. 当然我年少无知地配置了, 不知道是否必要. 关于android的准备工作,网上一查一大推,肯定可以配置成功. 这里不详细展开.

1.建立一个Android项目


  1. 打开Eclipse,点击File->New->Android Application Project,出现图1界面
  2. * 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.
  3. 下一步,设置图标,默认就行.
  4. 下一步,设置个活动模板,选择BlankActivity空活动

还有”通过命令行创建项目”我不写了,那是大牛的事.

2.运行你的App


android的空项目,竟然不是真正的空项目,而是默认包含了显示”Hello World!“的功能. 首先了解下android项目的目录结构和文件.

AndroidManifest.xml

该文件描述应用的基本性能.一个其中重要的元素是,里面包括 android:minSdkVersion 和 android:targetSdkVersion 属性. 具体的要去这里

src/

主要源文件的目录,一般包括一个活动类

res/

包含一些应用资源,如drawable_hdpi/, layout/ , values/ 等.详细的说明不表,可以查到

android的空项目,竟然不是真正的空项目,而是默认包含了显示”Hello World!“的功能.

在真实设备上运行


如果你有android设备,那么

  1. 安装你设备的windows驱动.不懂戳这里
  2. 允许你设备的USB调试

运行应用 点击Run –>Run as Android Application –>OK

在模拟器上运行

如果你没有android设备,可以使用android虚拟机Android Virtual Device (AVD). 创建一个AVD

  1. 打开eclipse中的Android Virtual Device Manager
  2. 点击New ,然后输入名字, 平台目标,SD卡大小,屏幕大小等
  3. 点 Create AVD
  4. 选择这个AVD并点 Start
  5. 当模拟器启动,解锁模拟器屏幕

然后在Eclipse运行应用,点击Run –>Run as Android Application –>OK

3.构建一个简单的用户界面


Android应用的GUI的构建需要用到ViewViewGroup对象的层级.对象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”.结果如下

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout\_width="match\_parent"
    android:layout\_height="match\_parent"
    android:orientation="horizontal" >
</LinearLayout>

LinearLayout是视图组用以展示子视图在水平或垂直方向,这通过android:orientation属性指定. LinearLayout的每个孩子都会按XML的顺序出现在屏幕上 其他两个属性 android:layout_width 和 android:layout_height 用来改变大小的. 因为LinearLayout是布局里的根视图,所以它应该填充整个屏幕区域.这通过将width和height设为”match_parent”.这个值声明,这个视图应扩展(expand)到与父视图一样的宽高. 想知道更多layout属性,见Layout

添加文本域


增加可编辑的文本域,需要在<LinearLayout>添加元素. 以下是你如何声明<EditText>

1
2
3
4
    <EditText android:id="@+id/edit_message"
        android:layout\_width="wrap\_content"
        android:layout\_height="wrap\_content"
        android:hint="@string/edit_message" />

关于这些属性

android:id

它提供为视图唯一的标示符(identifier). 当你指向任何XML里的资源,你需要符号(@).他后面跟着资源类型(这里是id),一个斜线,然后资源名(edit_message). 仅当你第一次定义资源ID时需要加号(+).当你编译这个应用时,SDK会使用这个ID创建一个新资源ID在你的项目的gen/R.java 文件中,这个ID指向EditText元素.一旦资源ID被声明,其他对该ID的引用无须加号.

android:layout_widthandroid:layout_height

“wrap_content”属性指定视图应该足够容得下所有内容.如果你用”match_parent”代替之,那么EditText元素将会填充屏幕,因为他将匹配他父亲LinerLayout的大小.

android:hint

这是当文本域为空时默认显示的字符串. 代替使用一个硬编码字符串作为值, “@string/edit_message”值指向在不同的文件中一个字符串资源. 因为这指向一个集中的资源,它不需要加号. 然而,因为你还没定义string资源,你会看到编译错误.你需要下一步进行改正.

添加String资源

当你需要在用户界面增加文本时,你需要制定每个字符串作为一个资源. 字符串资源允许你在一个位置管理所有的UI文本,这将变得容易找到和更新文本.外化(Externalizing)字符串允许你提供每个字符串资源的多种定义,并以不同的语言来本地化你的应用, 默认下,你的Android项目包含字符串资源在res/values/strings.xml目录下. 添加一个字符串名(name)叫”edit_message”,值为”Enter a message.” 同时,增加一个”Send”,名字(name)叫”button_send”

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">My First App</string>
    <string name="edit_message">Enter a message</string>
    <string name="button_send">Send</string>
    <string name="action_settings">Settings</string>
    <string name="title\_activity\_main">MainActivity</string>
</resources>

更多关于使用字符串资源对于不同的语言本地化你的应用,参见Supporting Different Devices

添加按钮

增加一个<Button>到布局,紧接在<EditText>后面.

1
2
3
4
    <Button
        android:layout\_width="wrap\_content"
        android:layout\_height="wrap\_content"
        android:text="@string/button_send" />

高度和宽度设为”wrap_content”,以至于按钮的大小决定于按钮的文本. 这个按钮不需要android:id属性,因为他不会被这个活动引用.

使输入框匹配屏幕宽度

这个布局目前设计成EditText和Button控件仅仅只有容下他们的内容的大小

看起来按钮正常,但文本域不好,有点短.这时可以改变LinearLayout里的weight属性

1
2
3
    <EditText
        android:layout_weight="1"
        ... />

为了提升效率,应该将EditText的width设为0. 因使用”wrap_content”会让系统进行计算 ,而这计算是毫不相关的,因为权值需要其他宽度计算来填充剩余空间.

1
2
3
4
    <EditText
        android:layout_weight="1"
        android:layout_width="0dp"
        ... />
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout\_width="match\_parent"
    android:layout\_height="match\_parent"
    android:orientation="horizontal">
    <EditText android:id="@+id/edit_message"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout\_height="wrap\_content"
        android:hint="@string/edit_message" />
    <Button
        android:layout\_width="wrap\_content"
        android:layout\_height="wrap\_content"
        android:text="@string/button_send" />
</LinearLayout>

这个布局通过默认的Activity类进行应用,当项目创建的时候,SDK工具可以直接生成,你可以运行应用查看结果

4.开始另一个活动

上个课程,教你显示一个带有文本域和按钮的活动. 本课将增加一些代码到 MainActivity 中,使用户点击Send 按钮使,启动另一个新活动.

对Send按钮的回应(Respond)

为了回应按钮的一次点击事件, 打开activity_main.xml 布局文件, 并增加 android:onClick 属性到<Button>.

1
2
3
4
5
<Button
    android:layout\_width="wrap\_content"
    android:layout\_height="wrap\_content"
    android:text="@string/button_send"
    android:onClick="sendMessage" />

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的活动.

1
Intent intent = new Intent(this, DisplayMessageActivity.class);

这个构造函数包含两个参数:

  • Context作为它的第一个参数(使用this是引文Activityclass是Context的子类)
  • 系统应该传递(deliver)这个Intent到app组件的类,(假若如此,这个活动应该被启动)

注意: 如果你使用一个诸如Eclipse的IDE, 那么对DisplayMessageActivity的引用会引发一个错误,因为这个类还不存在.暂时忽视这个错误,稍后你会创建这个类. 目的不仅仅允许你启动另一个活动,也能传输一堆数据到这个活动. 在sendMessage()方法中, 使用findViewById()来获得EditText元素,并添加文本值到这个目的:

1
2
3
4
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);

注意: 你需要导入声明android.content.Intentandroid.widget.EditText. 你需要马上定义EXTRA_MESSAGE常量. Intent能携带许多各种数据类型作为键值对(key-value pairs),也叫extras. putExtra()方法以键名作为第一个参数,键值作为第二个参数. 为了下一个活动查询额外数据,你需要额外使用一个公共常量来为你的intent的定义关键字.那么添加EXTRA_MESSAGE定义到MainActivity类的顶部.

1
2
3
4
public class MainActivity extends Activity {
    public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
    ...
}

额外使用你的app包的名字作为前缀来定义关键字,这通常来说是个很好的做法.假如你的app与其他app交互,这保证它们的唯一性,

启动第二个活动

开始一个活动,调用startActivity() 并传递到你的Intent. 系统接收这个调用然后启动一个由Intent指定活动的实例. 假如新代码,完整的包含Send按钮的sendMessage()方法如下:

1
2
3
4
5
6
7
8
/\*\* Called when the user clicks the Send button */
public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class);
    EditText editText = (EditText) findViewById(R.id.edit_message);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
}

现在你需要创建DisplayMessageActivity类来让它运行

创建第二个Activity

  1. 点击工具栏的 New
  2. 然后在新窗口打开 Android 文件夹 并选择 Android Activity. 点击Next.
  3. 选择BlankActivity 并点击Next.
  4. 填写活动的详情:

    • 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类应如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class DisplayMessageActivity extends Activity {

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity\_display\_message);

        // Make sure we're running on Honeycomb or higher to use ActionBar APIs
        if (Build.VERSION.SDK\_INT >= Build.VERSION\_CODES.HONEYCOMB) {
            // Show the Up button in the action bar.
            getActionBar().setDisplayHomeAsUpEnabled(true);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

Activity所有的子类必须执行onCreate()方法. 当创建一个活动的实例时, 系统调用它. 这个方法你必须用setContentView()方法来定义该活动布局.而且该方法你应该为活动组件执行最初的设置.

添加标题字符串

如果使用Eclipse, 你可以跳过这个步骤. 因为模板为新的活动提供了标题字符串,显示如下:

1
2
3
4
<resources>
    ...
    <string name="title\_activity\_display_message">My Message</string>
</resources>

添加到manifest

所有的活动必须在你的manifest中声明,AndroidManifest.xml,使用元素 当你使用Eclipse工具创建活动,会创建一个默认的条目.如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<application ... >
    ...
    <activity
        android:name="com.example.myfirstapp.DisplayMessageActivity"
        android:label="@string/title\_activity\_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

属性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()方法如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get the message from the intent
    Intent intent = getIntent();
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

    // Create the text view
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    // Set the text view as the activity layout
    setContentView(textView);
}

你现在可以运行app了, 当它打开, 在文本域输入消息, 点击Send按钮, 然后消息就出现在第二个活动中. 就是这样,你已经生成了你的第一个安卓应用! 想学更多,跟着来