1. 首页
  2. 虞美人传销

avd是什么属性 使用Eclipse和Android小部件进行Android开发的简介

Ayushman Jain
2010 年 12 月 13 日发布

简介

Android 是一种移动操作系统,类似于 Symbian、iOS、Windows Mobile 等。它最初是由 Android Inc. 开发的,该公司后来被 Google 收购了。现在它归 Open Handset Alliance 所有,是完全开源的,日益普及起来。 Google 在 Apache 权限下发布了大部分 Android 代码。通过该权限,供应商可以添加专用扩展,而无需将它们提交回开源社区。Android 的许多版本从一开始就打入市场(最新版自 2010 年第三季度起),包括精装的 Froyo (V2.2)。Android 已发展为不仅仅是移动设备的平台;新的 Google TV 也运行于 Android 之上。

Android 使用改进的 Linux 内核,允许应用使用 Java 库的 Java 技术开发应用程序(其中一些由 Google 为 Android 而开发)。虽然 Android 应用程序是用 Java 语言编写的,但是在平台中没有 Java Virtual Machine,且 Java 字节代码不被执行。Java 类被重新编译为 Dalvik 可执行文件且在 Dalvik 虚拟机上运行。Dalvik 是一种改进的 Android 虚拟机,是以低 CPU 靠电池供电运行的优化设备。

对于开发人员,Android SDK 提供丰富的工具集,包括调试器、库、手机仿真器、文档、样例代码和教程。使用 Eclipse(Android 的官方开发平台)并在一个名为 Android Development Tools (ADT) 的插件的辅助下,可以轻松开发 Android 应用程序。这有助于利用 Eclipse 的丰富特性,比如内容辅助、Java 搜索、开放源码、JUnit 集成,以及用于开发 Android 应用程序的不同视图和透视图。类似于 Java swing 小部件的一系列广泛的小部件,有助于为应用程序创建丰富的 UI。详细的 Javadoc 使开发过程相当简单。

这里,我们首先指导如何为 Android 开发准备系统。然后我们使用基本的 Hello World Android 应用程序简要地谈谈 Android 应用程序的突出特征。我们还要谈到组成 Android 应用程序的文件,以及 UI 是如何与实现分离的。在完成从 Eclipse 创建、开发和启动 Android 应用程序的过程之后,我们接着讨论一些有助于构建丰富的 UI(移动应用程序中非常重要的一部分)的 Android 小部件。我们使用样例应用程序展示一些基本的小部件。我们还讨论在电话簿般的应用程序中使用 listView 小部件,以及实现它的方式。期间,我们还将讨论为能够让应用程序访问操作系统上的一些数据而需要设置的权限。总地来说,在这篇文章上花费几个小时,您就可以创建一个实现基本功能且具有美观 UI 的应用程序。

系统要求

在开始 Android 开发之前,请确保安装了以下工具:

Eclipse SDK— 建议对最新的 Android SDK 使用 V3.5。这可以从 Galileo 下载页面进行下载。

Android SDK

Android Development Tools (ADT)— 这是一个 Eclipse 插件。它等同于用于 Android 开发的 JDT (Java Development Tools)。请遵循详细说明安装 ADT 插件,并设置 Android SDK 在 Eclipse 中的位置。

Android 术语

典型的 Android 应用程序具有如下组件。同时下面还有 Android Developer 站点 提供的定义:

活动 — 一个活动 呈现方便用户进行集中工作的直观 UI。例如,一个活动可能呈现可供用户选择的一个菜单项目列表,或者它可能显示照片及其字幕。一个文本消息传递应用程序可能有一个活动,显示要发送消息的联系人列表,而其他活动用于审查旧消息或更改设置。尽管它们共同协作形成一个紧密结合的 UI,每个活动都独立于其他活动。

内容提供者 — 一个内容提供者 将特定的应用程序数据集提供给其他应用程序。数据可存储在文件系统中,存储在 SQLite 数据库中,或以任何其他合乎逻辑的形式存在。

服务 — 一个服务 没有一个直观的 UI,但是无限期地在后台运行。例如,一个服务可能在用户关注其他事项时播放背景音乐,也可能通过网络获取数据或进行一些计算并将结果提供给需要它的活动。

广播接收器 — 一个广播接收器 是一个仅接收和响应广播公告的组件。许多广播源自系统代码 — 时区变化公告,低电量公告,语言偏好变更,等等。

值得了解的一些其他术语:

意图 — 活动、服务和广播接收器由一个名为意图 的异步消息激活。一个意图是一个保留消息内容的 Intent 对象。例如,他可能传达出一个请求,让活动呈现图像给用户或让用户编辑一些文本。

意图过滤器 — 一个意图过滤器可以显式地指定一个目标组件。如果它这么做,Android 会找到该组件(基于清单文件中的声明)并激活它。但是,如果未显式指定目标,Android 必须找到最好的组件来响应意图,即比较 Intent 对象与潜在目标的意图过滤器。一个组件的意图过滤器告知 Android 组件能够处理的意图。

要了解这些组件,请参阅 “用 Eclipse 开发 Android 应用程序” 和 Android Hello, World 教程。

创建一个 Android Virtual Device

在创建一个可在其上运行和测试应用程序的 Android 手机仿真器/Android Virtual Device (AVD) 时需要用到这一步。注意,AVD 要启动需要一些时间。好消息是,部署和测试每个应用程序不需要单独的 AVDs。启动 AVD 之后,可在它运行的同时部署任意数量的应用程序,它甚至还可用于调试应用程序。要创建一个 AVD:

在 Eclipse 中,选择 Window > Android SDK 和 AVD Manager。

选择 Virtual Devices in the left panel.

Click New。Create New AVD 对话框出现。

输入 AVD 的名称,比如 “myPhone”。

选择一个目标。目标是要在仿真器上运行的平台(即 Android SDK 版本,比如 2.1)。您还可选择 Google APIs,但这不必要,除非我们想特意在应用程序中拥有一些 Google API。其余字段可暂时忽略。

单击 Create AVD。

一旦启动 AVD,您可以看到它如何为真正基于 Android 的移动应用程序提供完整的外观,备有键盘和多触摸支持。它还可在用于测试应用程序的各种配置中用到,比如横向/纵向模式、网络优势和漫游网络,等等。所有这些选项都可使用 AVD 管理器得到配置。AVD 自我足以模拟各种可用的设备。您可以为不同的配置创建不同的 AVDs,并在每个上面测试您的应用程序,以确保它在不同类型的设备中是兼容的。

创建一个新 Android 项目

下面展示如何在 Eclipse 中创建一个新的 Android 项目(见图 1):

从 Eclipse 中选择 File > New > Project。如果成功安装了 Eclipse 的 ADT 插件,一个名为 Android 的文件夹应当出现在对话框中。展开该文件夹,应当可为新的 Android 项目提供选项。选中它并单击 Next。

您会被提示在一个表单中填写以下详细信息:

Project name— 这是您的项目的名称,可以是类似 “HelloWorld” 之类的名称。

Application name— 在运行您的应用程序时,这是会在您的 Android 设备中任何地方出现的名称,且其图标出现在菜单、快捷方式中以及标题栏上。该名称可以类似于 “Hello Android”。

Package name—com.example.helloandroid 或您自己的私有名称空间。包名称与 Java 语言中的那些遵循相同的规则。

Create activity— 为了我们这里的目的,我们可以称其为 SaySomething。这是将由 ADT 生成的类存根的名称。这将是 Android 的 Activity 类的一个子类。一个活动仅仅是一个可运行且执行一些工作的类。它可以选择拥有一个 UI。一个应用程序可能包含一个或多个活动。它们通常与在应用程序中找到的屏幕存在 1:1 关系。一个应用程序通过调用一个称为 startActivity() 或 startSubActivity() 的方法从一个活动移动到另一个活动。

Min SDK version— 这指定应用程序需要的最低 API 级别。最新版为 7。

图 1. 创建一个新 Android 项目

Hello Android 项目详情

Hello Android 是一个基本的 Android 项目,该项目仅打印 Hello World 到屏幕上。它在本文中具有以下作用:

展示创建新 Android 项目的流程。

概览一个 Android 项目中的文件及其用途。

展示如何部署一个应用程序到 AVD 上并测试它。

要查看文件和 Android 项目的其他资源部分,并使用 Eclipse 内的 Package Explorer 视图(Window > Show View > Package Explorer)。新创建的 Android 项目将包含以下内容(参见图 2):

有两个包含源代码的文件夹:

src 包含用户指定的所有类,包括默认的活动类。

gen 包含该文件夹内的 ADT. R.java 自动生成的文件,该文件夹包含对 res 文件夹中存在的所有资源的静态引用,这样就可以轻松、动态地通过 Java 代码引用它们。建议不要手动修改 R.java 的内容。

图 2. Hello Android 项目内容

res 文件夹包含用于项目的所有资源:图标、图像、字符串和布局。拥有一个独立的资源文件夹可将非源代码资源保留在代码外部,并可基于硬件、软件、方向和位置动态地选择资源。

它包括:

drawable 文件夹 — 针对所有图像文件。

layout 文件夹 — 针对以 XML 代码形式指定活动 UI 屏幕的布局。Main.xml 是自动生成的。该文件夹涉及到默认的纵向布局。为在横向布局(当一个 Android 设备旋转 90 度时)中表示一些 UI,创建一个 layout-land 文件夹并将您的布局 XML 文件放在那里。main.xml 文件有一个漂亮的 UI 表示,如图 3 所示。您可以将不同的布局和视图拖放到一个空白屏幕,以构建活动的 UI 组件。

values 文件夹 — 针对所有名称-值对(您的应用程序要定义的字符串)。

AndroidManifest.xml 也是项目的一个重要部分。它等同于插件的一个 plugin.xml 文件。它主要定义应用程序中的活动,并指定为每个活动指定的操作。它还列出应用程序执行各操作所需的权限。它也有一个漂亮的 UI。

图 3. main.xml 的 UI

让我们在磁盘上看一下项目文件夹的实际内容。在 Eclipse 中打开 Navigator View(Window > Show View > Navigator)。您会获得 HelloWorld 项目的结构,如图 4 所示。除了编译的类文件之外,您会在一个 bin 文件夹中获得下面三个文件:

classes.dex — 从编译类生成的可执行文件。

HelloWorld.apk — 将会附加到 Android 设备的压缩存档文件。可通过该存档文件将应用程序安装到任何 Android 设备上。

resources.ap_ — 压缩的应用程序资源。

Android 项目的目录结构

应用程序的主要 “Activity”

让我们看一下 MainActivity.java。

清单 1. MainActivity.java package com.example.helloandroid;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

有关该文件需要注意的事项:

MainActivity 扩展一个名为 Activity 的 Android 基类,该类位于 android.app 包内。

onCreate() 方法是该活动的默认入口点,必须为每个新活动实现。它接收一个 Bundle 类型的参数。创建活动所需的选项和参数被传递到该参数中。

setContentView() 负责使用 R.layout.main 参数创建主 UI。这是在 R.java 中定义的一个常量,表示在应用程序资源中找到的主要布局。

Main.xml

这个 XML 文件描述应用程序的 UI。一个活动可以引用这个 UI。不过,这个 UI 根本不会将自身绑定到任何活动。一个 UI 是使用布局和小部件构建的。Eclipse 默认构建的 main.xml 包含一个 LinearLayout,这表示所有元素都以单一列安排。然后它定义一个 textView,用于显示一个不可编辑的静态文本。在本例中是 strings.xml 文件中定义的 “hello” 字符串(‘@’ 标记是指在 res 文件夹中定义的文件)。每个视图元素还有属性,比如 layout_height 和 layout_width 等等。

图 5. Main.xml 和属性视图

使用 main.xml 文件的一个简单方式是通过属性视图(Window > Show View > Other > General > Properties)。在概览视图中选中特定视图时,属性选项卡中填充有视图的所有可能属性,如图 5 所示。这些属性大部分只有固定值可供选择,可以从属性选项卡中靠近每个属性的下拉菜单中选择。例如,要设置 layout_height,您可以查看下拉框,发现它仅有两个允许值:wrap_content 和 fill_parent。(wrap_content 将仅以原始大小绘制视图,而 fill_parent 会将其延伸到覆盖整个高度或宽度,或两者兼而有之。)
在仿真器上运行应用程序

为部署和运行应用程序,您需要定义一个运行配置。在 Eclipse 内选择 Open > Run > Dialog 或工具栏上的快捷方式,并选择 Android application。单击 New 并填写运行配置的名称。指定项目名称和默认活动。然后在目标选项卡中,选择一些想要的仿真器设置并指定希望启动的 AVD。单击 Run。您会获得如图 6 所示的 AVD。左边显示设备的屏幕,左下方是 QWERTY 小键盘,左上方是常见的移动设备按钮,比如拨号、挂断、静音、音量和主菜单。

图 6. Android Virtual Device

Android 小部件

我们已经知道如何创建和运行一个基本的 Android 应用程序了,现在让我们使用小部件来进行装饰(见图 7):

textView 包含 editText、Button 等小部件。可将 Buttons 进一步划分为:

CheckBox

RadioButton

ToggleButton 等

ImageView 包含 ImageButton 等小部件。

ViewGroup 包含以下布局:

Relative Layout

Table Layout

Frame Layout

Adapter View

Linear Layout

欲了解有关小部件的信息,“A Visual Guide to Android GUI Widgets” 是最好的指南。但是要注意因 Android 平台的快速变更而引入的不一致性。一个突出的例子就是,使用 id 作为上述指南中 main.xml 中的小部件的标识符属性。在最新的 Android 平台中,应当使用完全限定的 android:id。

图 7. Android 小部件的层次结构

使用小部件的样例应用程序

现在我们要修改现有应用程序,使其像图 8 中所示的那样。本例的目的在于让读者熟悉在真实应用程序中对 textView、editText、Button 和 Toast 等一些基本小部件的使用。

我们的应用程序将包含一个标题栏,其中含有 “WELCOME!!!” 消息。它将有三个 textView 小部件,从顶部开始垂直排列:一个是用默认字体表示的 “Hello World, how're you?”;第二个是 “Welcome to my first Android app”,斜体衬线文本,居中对齐,带白色背景;第三个是 “Type anything and press the button”,粗体等宽文本,带红色背景。这些之后是一个 editText 小部件,用于接受用户输入,然后是一个按钮小部件。按下按钮时,在 editText 小部件中输入的任何内容都会出现在屏幕底部中心的 Toast 小部件中。

这里不需要太多的实现代码。读者应当注意如何使用 ADT 的 GUI 编辑器为 XML 文件轻松将小部件放到应用程序中,以及如何使用由 Eclipse 提供的 “属性” 视图方便地设置小部件属性。本例将展示如何对 UI 和实现部分进行独立编码。

图 8. 带有小部件的 Android Virtual Device

string.xml

让我们在 string.xml 文件中添加一些新的字符串,更改现有的 welcome 字符串,最后是标题字符串。另外为两个 textViews 分别定义白色和红色背景。

清单 2. string.xml 文件 <resources>
<string name="hello">Hello World, how're you?</string>
<string name="app_name">Hello Android</string>
<string name="title">WELCOME!!!</string>
<string name="mainText">Welcome to my first android app</string>
<string name="subText">Type anything and press the button</string>
<color name="White">#FFFFFF</color>
<color name="Red">#FF0000</color>
</resources>

我们将 “hello” 字符串更改为包含 “Hello World, how're you?”。注意,这里的单引号需要转义字符('')。我们还定义了两个新的字符串:mainText 和 subText,分别用白色和红色背景。

main.xml

让我们使用 main.xml 的布局选项卡来拖放两个新的 textViews:一个 editText 小部件和一个按钮小部件。然后我们将使用 main.xml 中的属性选项卡来编辑每个小部件的属性。

清单 3. main.xml 文件 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/hello"
/>
<TextView
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:id="@+id/mainTextView"
android:gravity="center"
android:text="@string/mainText"
android:textStyle="italic"
android:typeface="serif"
android:background="@color/White">
</TextView>
<TextView
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_margin="20sp"
android:gravity="left"
android:id="@+id/subTextView"
android:padding="10sp"
android:text="@string/subText"
android:textStyle="bold"
android:typeface="monospace"
android:background="@color/Red">
</TextView>
<EditText
android:text="Enter text here"
android:id="@+id/EditText01"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</EditText>
<Button
android:text="Click me!"
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
</LinearLayout>

至此,我们定义了我们的 UI。现在需要将我们的活动代码与它相链接。

MainActivity.java

这是将 UI 链接到实现的文件。如同 HelloWorld 应用程序,我们使用 Activity.onCreate(Bundle) 方法来装饰屏幕上的所有 UI。已重写的 onClick(View) 方法将包含按钮点击的功能,其中用户输入文本会被读取并显示在 toast 小部件中的屏幕上。

清单 4. MainActivity.java 文件 package com.example.helloandroid;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String title = getString(R.string.title);
setTitle(title); // done so that we can change the default title
//get handles to editText and button widgets
final EditText eText = (EditText) findViewById(R.id.EditText01);
final Button button = (Button) findViewById(R.id.Button01);
button.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
//get the String entered into the editText widget
CharSequence editText = eText.getText();
//display the toast
Toast.makeText(MainActivity.this, editText, Toast.LENGTH_LONG).show();
}
});
}
}

使用该代码,我们会得到如图 8 所示的应用程序。

使用 listView 小部件:一个简单的样例应用程序

在本部分中,我们将创建一个样例应用程序(见图 9a,9b)来使用 listView 小部件显示电话簿中的所有联系人。本例的目的不止在于展示 listView 小部件的使用,而且展示如何使用 ContentProvider 和 ContentResolver 类获取电话数据。要留意 UI XML 文件,因为有两个 UI 布局:一个用于指定 listView 小部件显示的列表如何适应主 UI,另一个用于指定列表的每个元素的外观如何。另一个要点是,为使应用程序能够读取电话数据而进行的权限设置。该例是理解如何将意图和意图过滤器纳入应用程序的第一步。尽管意图不在本文讨论范围之内,读者可能会注意到,要将这个示例应用程序转化为实际电话簿应用程序,只需对列表项目实现点击操作,并创建一个呼叫意图和意图过滤器来发起对选定联系人的呼叫。

在本例中,联系人将以垂直线性方式显示,且选定的联系人出现在列表顶部,使用大斜体字体和蓝色背景。屏幕左下角还有一个复选框,选中该复选框时,将仅显示带星号的联系人(或首选联系人)。本例中应用程序的标题是 “Contact Manager”。这里我们使用三类小部件:textView、listView 和 checkBox。我们使用 textView 小部件来显示当前选中的联系人。您可以将 listView 小部件看作是 textView 小部件的列表。一个 listView 使用适配器设计模式来将数据(在本例中是联系人)和数据视图(在本例中是 textView)连接到 listView。在 listView 上的任何点击操作都可通过实现 AdapterView.OnItemClickListener() 被捕捉到。

在继续之前,我们应当在 Android 仿真器(AVD)的联系人部分拥有一些存储的联系人。为此,点击 AVD 主屏幕上的 Contacts,然后点击 Menu 来获取 Add Contacts 选项。Favorites 部分描述如何将联系人标记为首选的或带星号的。

图 9a. 联系人应用程序在一个 listView 小部件中显示所有联系人

图 9b. 联系人应用程序在选中 show-starred contacts 复选框时在一个 listView 小部件中显示所有带星号的联系人

现在我们要定义一些字符串。

清单 5. strings.xml 文件中定义的字符串 <resources>
<string name="hello">Hello World, Manager!</string>
<string name="app_name">Contact Manager</string>
<string name="selectedEntry" />
<color name="White">#FFFFFF</color>
<color name="Black">#000000</color>
<color name="Blue">#0000FF</color>
<string name="showStarred">Show starred contacts only</string>
</resources>
main.xml

让我们为我们的应用程序定义主布局。listView 小部件将提供电话簿中所有联系人的列表。listView 显示 textView 小部件内的每个项目,这是我们接下来要定义的。

清单 6. main.xml 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:gravity="center"
android:id="@+id/selectedContact"
android:padding="10dp"
android:textSize="20sp"
android:textStyle="italic"
android:typeface="serif"
android:background="@color/Blue"
android:textColor="@color/White"
android:text="@string/selectedEntry"/>
<ListView
android:id="@+id/contactsListView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
</ListView>
<CheckBox android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/showStarred"
android:text="@string/showStarred"/>
</LinearLayout>

注意,将 listView 的 layout_weight 设置为 1 可确保列表能尽可能多地覆盖屏幕,直到有新的小部件被定义。

contactItem.xml

除了主布局之外,这里我们需要定义另一个布局。这是为了表示 listView 中的每个元素。在这里我们使用一个简单的 textView。

清单 7. textView 小部件的代码,构成 listView 小部件的每个元素 <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:textStyle="bold"
android:id="@+id/contactItem">
</TextView>

注意,Android 默认提供一个可用的简单布局,而不用定义您自己的布局。这可以通过 android.R.layout.simple_list_item_1 得到引用。

ManageContacts.java

清单 8 展示如何实现主活动。我们使用 populateContactList() 方法来查询联系人数据库并在 listView 中显示它们。

清单 8. 主活动的实现 public class ManageContacts extends Activity {
private ListView mContactList;
private CheckBox mCheckBox;
private boolean mShowStarred;
private TextView selectedText;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mContactList = (ListView) findViewById(R.id.contactsListView);
mCheckBox = (CheckBox) findViewById(R.id.showStarred);
selectedText = (TextView) findViewById(R.id.selectedContact);
mShowStarred = false;
mCheckBox.setOnCheckedChangeListener(new CheckChangedListener());
mContactList.setOnItemClickListener(new ClickListener());
populateContactList();
}
public void populateContactList() {
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
};
String[] selectionArgs = null;
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME +
" COLLATE LOCALIZED ASC";
String selection = mShowStarred? ContactsContract.Contacts.STARRED +
" ='1'" : null;
Cursor c = getContentResolver().query(uri, projection, selection, selectionArgs,
sortOrder);
String[] fields = new String[] {
ContactsContract.Data.DISPLAY_NAME
};
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contactitem,
c, fields, new int[] {R.id.contactItem});
mContactList.setAdapter(adapter);
}
private class ClickListener implements OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> arg0, View textView, int pos, long arg3) {
if(textView instanceof TextView)
selectedText.setText(((TextView) textView).getText());
}
}
private class CheckChangedListener implements OnCheckedChangeListener {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mShowStarred = isChecked;
selectedText.setText("");
populateContactList();
}
}
}

需要注意的事项:

我们有两个侦听器 — 一个用于处理对列表项目的点击,另一个用于处理对复选框的点击。前者仅将蓝色 textView 框中的文本设置为当前选中联系人的显示名称。后者将设置 mShowStarred 字段并重新填充列表。

要读取电话数据库中的联系人,我们需要通过查询它获取一个游标。查询具有以下参数:

uri— 为要检索的内容使用 content:// 模式的 URI。

projection— 要返回的列的列表。传递空值将返回所有列,不建议这样做,以防止从不打算使用的存储中读取数据。

selection— 一个声明要返回哪些行的过滤器,被格式化为一个 SQL WHERE 子句(排除 WHERE 本身)。传递空值将为给定 URI 返回所有行。

selectionArgs— 您可能还包含 ?s,这将由来自 selectionArgs 的值以它们出现在选取范围中的顺序所取代。该值将被绑定为 Strings。

sortOrder— 如何对行进行排序,被格式化为一个 SQL ORDER BY 子句(排除 ORDER BY 本身)。传递空值将使用默认的排序顺序,这个顺序可能是无序的。

获得的结果集游标必须通过一个适配器链接到 UI。在这里我们使用一个 SimpleCursorAdapter,不过 Android 还提供一个 ListAdapter。获取适配器之后,我们需要将其附加到 listView,现在完成了。

权限

应用程序在 Android 设备上成功运行之前的最后一步是设置权限。没有能够读取联系人数据库的权限,设备中的 Linux 内核不会允许应用程序这么做。因此让我们转至 AndroidManifest.xml>Permissions 选项卡,并设置以下权限:

android.permission.GET_ACCOUNTS

android.permission.READ_CONTACTS

可以通过点击 U 图标并定义权限来进行这些设置。图 10 展示权限选项卡的外观。

图 10. Android 权限清单

使用 ListActivity 的 listView 小部件

本例意在展示实现 listView 的另一种方式。在上述应用程序中,注意到我们的主活动实现了活动类。在处理 listView 小部件时,有时 ListActivity 类来得更方便些,因为它有一个公共 APIs 可处理对列表项目的点击、列表适配器的设置、点击位置的获取,等等。

我们可以修改我们的活动来实现 ListActivity,如清单 9 所示。

清单 9. 使用 ListActivity 的实现 public class ManageContacts extends ListActivity {
@Override
protected void onListItemClick(ListView l, View v,
int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
if(v instanceof TextView)
selectedText.setText(((TextView) v).getText());
}
private CheckBox mCheckBox;
private boolean mShowStarred;
private TextView selectedText;
/** Called when the activity is first created. */
@Override
public void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mCheckBox = (CheckBox) findViewById(R.id.showStarred);
selectedText = (TextView)
findViewById(R.id.selectedContact);
mShowStarred = false;
mCheckBox.setOnCheckedChangeListener(new
CheckChangedListener());
populateContactList();
}
public void populateContactList() {
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
};
String[] selectionArgs = null;
String sortOrder =
ContactsContract.Contacts.DISPLAY_NAME +
" COLLATE LOCALIZED ASC";
String selection = mShowStarred?
ContactsContract.Contacts.STARRED + " ='1'" : null;
Cursor c =
getContentResolver().query(uri, projection,
selection, selectionArgs, sortOrder);
String[] fields = new String[] {
ContactsContract.Data.DISPLAY_NAME
};
ListAdapter adapter = new
SimpleCursorAdapter(this,
R.layout.contactitem, c, fields, new
int[]{R.id.contactItem});
setListAdapter(adapter);
}
private class CheckChangedListener
implements OnCheckedChangeListener {
@Override
public void onCheckedChanged(CompoundButton
buttonView, boolean isChecked) {
mShowStarred = isChecked;
selectedText.setText("");
populateContactList();
}
}
}

注意,这里我们仅实现了 ListActivity 的 onListItemClick 方法,而非声明一个匿名类来处理点击。在这里我们也不需要引用在 main.xml 中定义的 listView 小部件,因为 ListActivity 假定已经定义了 ID 为 @android:id/list 的 listView 小部件。这一点需要注意。每当我们使用 ListActivity 时,我们都必须在 main.xml 中定义 listView 小部件,使其 ID 为 @android:id/list;否则,ListActivity 不会知道要引用哪个 listView。

结束语

在本教程中,我们学习了如何设置 Eclipse 来进行 Android 开发,以及 Eclipse 丰富的特性如何在编写 Android 应用程序的每一步中提供帮助。我们还了解了如何在 Android 仿真器 — AVD 上轻松部署和测试应用程序。我们使用一个 Hello World 示例介绍了 Android 应用程序的突出特性,并了解了组成 Android 应用程序的文件。我们论及了 Android 提供的一些小部件,并看到了它们在实际示例中的使用。您现在应当可以创建一个带有整洁 UI 的酷应用程序了。第一步是扩展联系人应用程序,实现对列表项目的单击操作,以显示电话号码和联系人详细信息,以及一个用于呼叫选定联系人的按钮。还应定义一个意图以及一个意图过滤器,这应当实现呼叫发出功能。

Android 是面向移动设备的一个强大平台,而且应用 Java 技术的编码以及 Android Development Tools for Eclipse 使其更易于为初学者所接受。虽然有着丰富的 UI,它广泛的小部件及其将 UI 元素绑定到实现的能力,提供了较大的灵活性,使应用程序变得轻型化。活动、意图、 内容提供者等概念更便于我们管理 UI 和数据元素,并控制它们之间的绑定。它还有大量网络 APIs 可供探究。此外,Google APIs 提供地图、搜索和邮件等功能,这些在 Android 应用程序中都可轻易采用。因此请尽情投入精彩的 Android 世界,任您的想象力自由驰骋。

相关主题

原创文章,作者:脓拖网,如若转载,请注明出处:https://www.lpjyr.com/yumeirenchuanxiao/35398.html