Android是一种移动操作系统,类似于Symbian,iOS,Windows®Mobile等。 它最初由Android Inc.开发,后来被Google收购。 它现在由开放手机联盟(Open Handset Alliance)拥有,并且是完全开源的,这说明它越来越受欢迎。 Google根据Apache许可发布了大多数Android代码。 有了此许可证,供应商可以添加专有扩展,而无需将其提交回开源社区。 自推出以来(包括2010年第三季度的最新版本),许多版本的Android进入市场,其中包括功能强大的Froyo(V2.2)。 Android已经超越了单纯的移动设备平台。 新的Google TV也可以在Android上运行。

Android使用经过修改的Linux®内核,并允许使用Java库(其中一些由Google为Android开发)以Java™技术开发应用程序。 虽然Android应用程序是用Java语言编写的,但平台中没有Java虚拟机,因此Java字节码不会执行。 Java类被重新编译为Dalvik可执行文件,并在Dalvik虚拟机上运行。 Dalvik是适用于Android的经过修改的VM,并且是使用电池电力和低CPU运行的优化设备。

对于开发人员,Android SDK提供了丰富的工具集,包括调试器,库,手机模拟器,文档,示例代码和教程。 借助名为Android开发工具(ADT)的插件,可以使用Eclipse(Android的官方开发平台)轻松开发Android应用程序。 这有助于利用Eclipse的丰富功能,例如内容辅助,Java搜索,开放资源,JUnit集成以及用于开发Android应用程序的不同视图和观点。 类似于Java swing小部件的各种小部件有助于为应用程序创建丰富的UI。 详细的Javadoc使开发过程非常容易。

在这里,我们从为Android开发准备系统的指南开始。 然后,我们使用基本的Hello World Android应用程序简要介绍Android应用程序的主要功能。 我们还将讨论构成Android应用程序的文件,以及如何将UI与实现分离。 在完成了从Eclipse创建,开发和启动Android应用程序的过程之后,我们将继续讨论一些有助于构建丰富UI(移动应用程序非常重要的部分)的Android小部件。 我们将在示例应用程序的帮助下演示一些基本的小部件。 我们还讨论了在类似电话簿的应用程序中使用listView小部件及其实现方式。 在这两者之间,我们还讨论了为了使应用程序能够从OS访问某些数据而需要设置的权限。 总体而言,文章中的几个小时应该可以使您创建一个实现基本功能并具有漂亮UI的应用程序。

系统要求

在开始Android开发之前,请确保已安装以下设备:

  • Eclipse SDK-建议将V3.5与最新的Android SDK一起使用。 可以从Galileo下载页面下载。
  • Android SDK
  • Android开发工具(ADT) -这是Eclipse插件。 它等效于用于Android开发的JDT(Java开发工具)。 请遵循有关安装ADT插件以及在Eclipse中设置Android SDK位置的详细说明。

Android术语

典型的Android应用程序具有以下组件。 以下还给出了Android开发者网站提供的定义:

  • 活动- 活动为用户可以进行的一项重点工作提供了一个可视化UI。 例如,一项活动可能会显示用户可以选择的菜单项列表,或者可能会显示照片及其标题。 短信应用程序可能具有一个活动,该活动显示向其发送消息的联系人列表,另一个活动,将消息写入所选联系人,以及其他活动,以查看旧消息或更改设置。 尽管它们一起工作以形成一个有凝聚力的UI,但是每个活动都独立于其他活动。
  • 内容提供程序— 内容提供程序使一组特定的应用程序数据可供其他应用程序使用。 数据可以存储在文件系统,SQLite数据库或任何其他逻辑方式中。
  • 服务- 服务没有可视化的UI,但是会在后台无限期地运行。 例如,一项服务可能会在用户处理其他事务时播放背景音乐,或者可能会通过网络获取数据或进行计算,然后将结果提供给需要它的活动。
  • 广播接收器- 广播接收器是一个组件,除了接收广播公告并对其做出React外,什么也不做。 许多广播源自系统代码-时区更改公告,电池电量不足公告,语言偏好更改等。

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

  • 意图-活动,服务和广播接收器由称为意图的异步消息激活。 意图是保存消息内容的Intent对象。 例如,它可能会传达对活动的请求,以向用户呈现图像或让用户编辑一些文本。
  • 意图过滤器—意图对象可以显式命名目标组件。 如果是这样,Android会找到该组件(基于清单文件中的声明)并激活它。 但是,如果未明确指定目标,Android必须找到最佳组件以响应此意图。 它通过将Intent对象与潜在目标的Intent过滤器进行比较来实现。 组件的意图过滤器会告知Android组件能够处理的意图类型。

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

创建一个Android虚拟设备

创建可在其上运行和测试应用程序的Android手机仿真器/ Android虚拟设备(AVD)时,需要执行此步骤。 请注意,AVD需要花费一些时间才能启动。 好消息是,不需要为每个要部署和测试的应用程序使用单独的AVD。 一旦启动了AVD,就可以在仍在运行的同时部署任何数量的应用程序,甚至可以用来调试应用程序。 创建AVD:

  1. 在Eclipse中,选择窗口> Android SDKAVD Manager
  2. 在左侧面板中选择虚拟设备
  3. 点击新建 。 出现“ 创建新的AVD”对话框。
  4. 键入AVD的名称,例如“ myPhone”。
  5. 选择一个目标。 目标是要在模拟器上运行的平台(即Android SDK的版本,例如2.1)。 您还将获得一个选择Google API的选项,但这是不必要的,除非我们希望专门在应用程序中包含一些Google API。 现在可以忽略其余字段。
  6. 单击创建AVD

AVD启动后,您将看到它如何为真实的基于Android的手机提供完整的外观和感觉,并带有键盘和多点触控支持。 它还可以用于多种配置中以测试您的应用,例如横向/纵向模式,网络强度和漫游网络等。所有这些选项都可以使用AVD管理器进行配置。 AVD具有自给自足的功能,可以模拟可用的不同设备。 您可以为不同的配置创建不同的AVD,并在每个应用程序上测试您的应用程序,以确保其在所有设备类型之间都兼容。

创建一个新的Android项目

这是在Eclipse中创建新的Android项目的方法(参见图1):

  1. 在Eclipse中,选择File> New> Project 。 如果已成功安装Eclipse的ADT插件,则对话框中应存在一个名为Android的文件夹。 扩展该文件夹应为新的Android项目提供选项。 选择它,然后单击下一步
  2. 系统将提示您在表格中填写以下详细信息:
  • 项目名称 -这是项目的名称 ,可以是“ HelloWorld”之类的名称。
  • 应用程序名称 -运行应用程序时,该名称将出现在Android设备中的任何地方,以及菜单中的图标,快捷方式和标题栏上的图标。 可能类似于“ Hello Android”。
  • 包名称 com.example.helloandroid或您自己的私有名称空间。 程序包名称遵循与Java语言相同的规则。
  • 创建活动 -在这里我们可以将其称为SaySomething。 这是将由ADT生成的类存根的名称。 这将是Android的Activity类的子类。 活动只是可以运行并完成某些工作的类。 它可以有一个UI。 一个应用程序可能包含一个或多个活动。 它们通常与应用程序中的屏幕呈1:1关系。 通过调用称为startActivity()startSubActivity()的方法,应用程序可以从一种活动转移到另一种活动。
  • 最低SDK版本 -这指定您的应用程序所需的最低API级别。 最新的是7。
图1.创建一个新的Android项目

您好Android项目的详细信息

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

  • 演示创建新Android项目的过程。
  • 概述Android项目中的文件及其用途。
  • 演示如何在AVD上部署和测试应用程序。

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

  • 有两个包含源代码的文件夹:
  1. src包含用户指定的所有类,包括默认活动类。
  2. gen包含ADT自动生成的文件。 此文件夹中的R.java包含对res文件夹中存在的所有资源的静态引用,因此可以轻松地从Java代码中动态引用它们。 建议不要手动修改R.java的内容。
图2. Hello Android项目内容
  • res文件夹包含该项目的所有资源:图标,图像,字符串和布局。 具有单独的资源文件夹可将非源代码资源保留在代码外部,并且可以根据硬件,语言,方向和位置动态选择资源。

它包括:

  1. 可绘制的文件夹—所有图像文件的含义。
  2. 布局文件夹- 布局的含义,以XML代码的形式指定活动的UI屏幕。 Main.xml是自动生成的。 此文件夹属于默认的肖像布局。 为了在横向布局中表示一些UI(当Android设备旋转90度时),请创建一个layout-land文件夹,然后将您的布局XML文件放在此处。 main.xml文件具有很好的UI表示形式,如图3所示。您可以将不同的布局和视图拖放到空白屏幕上,以构建活动的UI组件。
  3. values文件夹-所有名称/值对(应用程序要定义的字符串)的含义。
  • AndroidManifest.xml也是该项目的重要组成部分。 这等效于插件的plugin.xml文件。 它基本上定义了应用程序中的活动,并指定了为每个活动指定的动作。 它还列出了应用程序执行各种操作所需的权限。 再次,它有一个不错的用户界面。
图3. main.xml的UI

让我们看一下光盘上项目文件夹的实际内容。 在Eclipse中打开“导航器视图”(“ 窗口”>“显示视图”>“导航器” )。 您将获得HelloWorld项目的结构,如图4所示。除了已编译的类文件之外,您还将在bin文件夹中获得以下三个文件:

  1. classes.dex —从编译的类生成的可执行文件。
  2. HelloWorld.apk-将压缩的存档文件发送到Android设备。 该应用程序可以通过此存档文件安装在任何Android设备上。
  3. resources.ap_ —压缩的应用程序资源。
Android项目的目录结构

应用程序的主要“活动”

让我们检查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. */@Overridepublic 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_heightlayout_width等属性。

图5. Main.xml和属性视图

使用main.xml文件的一种简单方法是通过属性视图(“ 窗口”>“显示视图”>“其他”>“常规”>“属性” )。 在大纲视图中选择特定视图时,将在该属性选项卡中填充该视图的所有可能属性,如图5所示。大多数这些属性只有固定值可供选择,可以从下拉菜单中选择-属性标签中每个属性旁边的下拉菜单。 例如,要设置layout_height ,您可以看到下拉框并发现它只有两个允许的值: wrap_contentfill_parent 。 ( wrap_content只会将视图绘制为其原始大小,而fill_parent会将其拉伸以覆盖整个高度或宽度,或两者都覆盖。)
注意:对于layout_heightlayout_width ,您还可以以以下两个单位指定大小:(a)密度无关像素(dp)-此大小使布局在不同屏幕大小的设备上查看时看起来相同。 例如: layout_width = 10dp; (b)与比例无关的像素(sp)-与dp相似,但这是建议的移动电话标准。 例如: layout_width = 10sp。)还要注意的另一件事是,如果要引用Java代码中的某些视图/小部件,则需要具有唯一的ID。 如果使用main.xml的布局选项卡拖放窗口小部件,则ADT将自动为该窗口小部件创建ID,其格式为“ @ + id / someView”。 然后,在Java代码中,可以将其引用为R.id.someView

在模拟器上运行应用

为了部署和运行应用程序,您需要定义运行配置。 在Eclipse内的工具栏上选择打开>运行>对话框或快捷方式,然后选择Android应用程序 。 单击新建,然后填写运行配置的名称。 指定项目名称和默认活动。 然后在目标选项卡中,选择一些所需的仿真器设置,然后指定要启动的AVD。 点击运行 。 您将获得如图6所示的AVD。设备的屏幕显示在左侧,左下角是QWERTY键盘,并且在屏幕上显示了常见的移动按钮,例如拨号,挂断,静音,音量和主页。左上方。

图6. Android虚拟设备

Android小部件

现在我们知道了如何创建和运行基本的Android应用程序,下面我们来介绍一下小部件(见图7):

  • textView由窗口小部件如editText ,按钮等按钮可以被进一步分类成:

    • 复选框
    • 单选按钮
    • ToggleButton等
  • ImageView由小部件(例如ImageButton)组成。
  • ViewGroup由以下布局组成:
    • 相对布局
    • 表格布局
    • 框架布局
    • 适配器视图
    • 线性布局

有关小部件的信息,最好的指南是“ Android GUI小部件的可视指南 ”。 但是,请注意由于Android平台的快速变化而在此处引入的不一致之处。 一个明显的例子是使用id作为上述指南main.xml部件的标识符属性。 在最新的Android平台中,应使用完全合格的android:id

图7. Android小部件层次结构

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

现在,我们将修改现有的应用程序看起来像图8.这个例子的目的是为了使读者熟悉使用像一些基本的小部件textVieweditText在一个真正的应用程序,Button和吐司。

我们的应用程序将包含标题栏,并显示消息“ WELCOME !!!”。 它将从顶部开始,垂直排列三个textView小部件:一个说“ Hello World,你好吗?”。 默认字体; 接下来是“欢迎使用我的第一个Android应用程序”,斜体衬线文本,居中对齐,带有白色背景; 第三句是红色背景的粗体等宽文字“键入任何内容并按下按钮”。 这三个之后是一个editText小部件以接受用户输入,然后是一个按钮小部件(该按钮带有消息“ Click Me!”)。 按下按钮时, editText小部件中键入的内容editText显示在屏幕底部中心的Toast小部件中。

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

图8.带有小部件的Android虚拟设备

string.xml

让我们在string.xml文件中添加一些新字符串,更改现有的欢迎字符串,最后更改标题字符串。 我们还要在这里为两个textView的背景定义白色和红色。

清单2. string.xml文件
<?xml version="1.0" encoding="utf-8"?>
<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,你好吗?” 请注意,单引号在此处需要转义字符( '\' )。 我们还定义了两个新的字符串: mainTextsubText ,颜色为白色和红色。

main.xml

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

清单3. main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<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/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. */@Overridepublic 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 widgetsfinal EditText eText = (EditText) findViewById(R.id.EditText01);final Button button = (Button) findViewById(R.id.Button01);button.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View v) {//get the String entered into the editText widgetCharSequence editText = eText.getText();//display the toastToast.makeText(MainActivity.this, editText, Toast.LENGTH_LONG).show();}});}
}

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

使用listView小部件:一个示例应用程序

在本节中,我们将创建一个示例应用程序(参见图9a,9b),以使用listView小部件显示电话簿中的所有联系人。 此示例的目的不仅是展示listView小部件的用法,还展示如何使用ContentProvider和ContentResolver类来获取电话数据。 注意UI XML文件,因为有两种UI布局:一种用于指定listView小部件显示的列表如何适合主UI,另一种用于指定列表的每个元素的外观。 另一个重要的一点是为应用程序设置了读取电话数据的权限。 此示例是了解如何将意图和意图过滤器结合到应用程序中的第一步。 尽管意图不在本文讨论范围之内,但读者可能会注意到,要将此示例应用程序转换为真实的电话簿应用程序,只需在列表项上实施点击操作并创建呼叫意图和意图过滤器即可启动呼叫选定的联系人。

在此示例中,联系人将以垂直线性方式显示,并且所选联系人以大斜体和蓝色背景出现在列表的顶部。 我们在屏幕的左下方还有一个复选框,选中该复选框时,仅显示已加星标(或收藏的联系人)。 在这种情况下,应用程序的标题为“ Contact Manager”。 在这里,我们使用三种类型的小部件: textViewlistViewcheckBox 。 我们使用textView小部件显示当前选定的联系人。 可以假设listView控件是列表textView部件。 甲listView使用适配器设计模式的数据(触点,在这种情况下)和数据图(连接textView ,在这种情况下)到listView 。 可以通过实现AdapterView.OnItemClickListener()捕获对listView任何单击。

在继续之前,我们应该在Android模拟器(AVD)的“联系人”部分中存储一些联系人。 可以通过在AVD主屏幕上单击“ 联系人”来完成,然后单击“ 菜单”以获取“ 添加联系人”选项。 “ 收藏夹”部分介绍了如何将联系人标记为收藏/已加星标。

图9a。 联系人应用程序在listView小部件中显示所有联系人
图9b。 当选中显示星标的联系人复选框时,联系人应用程序在listView小部件中显示所有已加星标的联系人

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

清单5.在strings.xml文件中定义的字符串
<?xml version="1.0" encoding="utf-8"?>
<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小部件将容纳电话簿中所有联系人的列表。 listViewtextView小部件中显示每个项目,接下来我们将对其进行定义。

清单6. main.xml
<?xml version="1.0" encoding="utf-8"?>
<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: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小部件的每个元素
<?xml version="1.0" encoding="utf-8"?>
<TextViewxmlns:android="http://schemas.android.com/apk/res/android"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. */@Overridepublic 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 {@Overridepublic void onItemClick(AdapterView<?> arg0, View textView, int pos, long arg3) {if(textView instanceof TextView)selectedText.setText(((TextView) textView).getText());}}private class CheckChangedListener implements OnCheckedChangeListener {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {mShowStarred = isChecked;selectedText.setText("");populateContactList();}}
}

注意事项:

  • 我们有两个侦听器-每个侦听器用于处理列表项的单击,另一个用于处理复选框的单击。 前者只是将蓝色textView框中的文本设置为当前所选联系人的显示名称。 后者是设置mShowStarred字段并重新填充列表。
  • 要从电话数据库中读取联系人,我们需要对其进行查询以获取光标。 该查询具有以下参数:
    1. uri —使用content://方案检索内容的URI。
    2. projection —返回哪些列的列表。 传递null将返回所有列,不建议这样做,以防止从不会使用的存储中读取数据。
    3. selection(选择) —声明返回哪些行的过滤器,格式为SQL WHERE子句(不包括WHERE本身)。 传递null将返回给定URI的所有行。
    4. selectionArgs-您可以包括? s,该值将被selectionArgs的值替换,并以它们在选择中出现的顺序出现。 这些值将绑定为字符串。
    5. sortOrder —如何对行进行排序,格式为SQL ORDER BY子句(不包括ORDER BY本身)。 传递null将使用默认的排序顺序,该顺序可能是无序的。

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

权限

我们的应用在Android设备上成功运行之前的最后一步是设置权限。 如果没有读取联系人数据库的权限,设备中的Linux内核将不允许应用程序这样做。 因此,我们转到AndroidManifest.xml>“权限”标签,并设置以下权限:

  1. android.permission.GET_ACCOUNTS
  2. android.permission.READ_CONTACTS

可以通过单击U图标并定义权限来进行设置。 图10显示了“权限”选项卡的外观。

图10. Android权限清单

使用ListActivity listView小部件

此示例旨在演示实现listView另一种方法。 在上面的应用程序中,请注意我们的主要活动实现了活动类。 在处理listView窗口小部件时,有时ListActivity类会更方便,因为它具有公共API来处理对列表项的单击,设置列表适配器,获取单击位置等。

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

清单9.使用ListActivity实现
public class ManageContacts extends ListActivity {@Overrideprotected 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();}}
}

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

结论

在本教程中,我们学习了如何为Android开发设置Eclipse,以及Eclipse的丰富功能如何在编写Android应用程序的每个步骤中提供帮助。 我们还了解了如何在Android模拟器AVD上轻松部署和测试应用程序。 我们使用Hello World示例介绍了Android应用程序的主要功能,并了解了构成Android应用程序的文件。 我们介绍了Android提供的一些小部件,并在一些实际示例中看到了它们的用法。 现在,您应该可以很好地创建具有简洁UI的出色应用程序。 第一步,扩展联系人应用程序以对列表项执行单击操作,以显示电话号码和联系人详细信息,以及一个按钮来呼叫选定的联系人。 还应定义一个呼叫意图以及意图过滤器,该过滤器应实现呼叫建立功能。

Android是用于移动应用程序的强大平台,并且Java技术的编码以及Eclipse的Android开发工具使之易于被初学者采用。 尽管拥有丰富的UI,但它的各种小部件以及将UI元素动态绑定到实现的能力提供了很大的灵活性,并使应用程序轻巧。 活动,意图,内容提供者等的概念使管理UI和数据元素以及控制它们之间的绑定变得容易。 它还有大量的网络API可供探索。 此外,Google API还提供了用于地图,搜索和邮件的功能,所有这些功能都可以轻松地在Android应用程序中采用。 因此,深入研究Android的奇妙世界,让您的想像力发狂。


翻译自: https://www.ibm.com/developerworks/opensource/tutorials/os-eclipse-androidwidget/index.html

使用Eclipse和Android小部件进行Android开发的简介相关推荐

  1. surface android模拟,Surface Duo将支持Android小部件 模拟磁铁体验

    中关村在线消息:根据国外媒体曝光的信息,即将发售的双屏智能手机Surface Duo将支持Android的交互式小部件,以满足喜欢Windows Phone上的实时磁贴的用户的需求. 据悉,用户可以将 ...

  2. 手机bootstrap搜索框_这些桌面小部件,Android 手机可不能错过

    在开源.可玩性较高的安卓系统上,小部件呈现了与 iOS 不一样的魅力.它高度的灵活自由,使得安卓手机用户,更能对自己的手机桌面进行个性化的定制. 可在细数当下众多的安卓小部件里,哪些能在保持实用性的同 ...

  3. 基于Android小巫新闻客户端开发---显示新闻详细内容UI设计

    基于Android小巫新闻客户端开发---显示新闻详细内容UI设计 2013年2月27日,天气潮湿!!! 距上一次写的主界面业务逻辑实现,已经过来11天,小巫觉得拖得太久了,所以决定尽量把所有的内容介 ...

  4. android小部件如何实时更新,android – 使用AlarmManager手动更新小部件

    如 Android Dev Guide中所述,如果您希望窗口小部件更频繁地更新,则应使用AlarmManager设置不唤醒设备的警报. 原则上:不要使用AppWidgetProvider类提供的标准机 ...

  5. android小部件的作用,Android 应用小部件的实现

    有些时候,我们需要为自己的应用添加一个桌面小部件来显示一些简单但是关键的信息方便用户使用.应用小部件的视图是靠RemoteViews来展现的,而RemoteViews内只能放置一些简单的ViewGro ...

  6. Android 小部件播放视频

    最近在对小组件进行迭代, 之前已经解决过一些问题, 例如: 图片的圆角怎么在小组件上展示并兼容多个系统版本 小组件后台怎么更新,如何将小组件拆分成单独模块 对于小组件播放视频, 找不到直接可以调用的a ...

  7. android小闹钟程序,Android实现闹钟小程序.pdf

    Android实实现现闹闹钟钟小小程程序序 这篇文章主要为大家详细介绍了Android实现闹钟小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 最近写了 闹钟的程序,看到SharedPrefe ...

  8. (Android小应用)在Android中实现多线程断点下载(连载二)

    前面已经讲了通过多线程下载网络文件的一部分核心代码,下面继续做我们的项目 当然如果我们做小一点的Android项目的时候可以先做界面,然后根据需要来扩展所需要的功能,当然有的时候我们宁愿先实现业务,业 ...

  9. android 小白点代码,Android实现小圆点显示未读功能

    ####前言 以前我们实现这个功能都是用 BadgeView.java,大体就是将这个java类复制到自己的项目中,然后在项目中使用,今天讲的也是一款BadgeView,我将其封装称工具类Badget ...

最新文章

  1. oracle java rmi 漏洞,Oracle Java SE Java运行时环境RMI子组件远程漏洞(CVE-2011-3556)
  2. go语言csv包_玩转数据处理120题R语言版本
  3. vector模板,初学者必读
  4. 常用SEO优化之META标签
  5. 目标检测第6步:YOLOv5(5.0)如何在Colab中训练自定义数据集?(更新时间:2022.3.22)
  6. python3urllib常见使用_Python3 urllib常用操作
  7. 安卓逆向系列教程 4.9 破解内购 II
  8. 十步一拆:iPhone4S拆机十步曲
  9. leetcode第12题Python版整数转罗马字符串
  10. 售前工程师是做什么的?
  11. Android studio 打包 uni App 修改apk名称,app名称及图标
  12. oracle 白鳝 row cache lock,ROW CACHE LOCK导致数据库CPU高案例分析
  13. 数字化是实现“跨界打劫”的超级武器
  14. 关于/var/run/docker.sock那些事儿
  15. 关于Code Virtualizer pcode解密的一种方法
  16. 转:真正的管理不会像交响乐一样,只由一人来指挥千军万马
  17. (排列组合的重复问题)
  18. How to Pronounce PROBABLY
  19. HDU-2549 壮志难酬
  20. 内蒙古大学计算机学院创新创业,我校获评2018年度全国创新创业典型经验高校...

热门文章

  1. minicom指令_minicom 使用
  2. dolphinscheduler-2.0.3
  3. 网页返回顶部功能实现
  4. [转]如何做到高效配合?浅谈项目管理中的闭环思维
  5. Android 查看更多 TextView实现
  6. ASIO插件 真的能提升 音质?(听音乐者必看)
  7. java中inputstream_Java InputStream类
  8. 基于Springboot+vue的心理测评数据分析系统(Java毕业设计)
  9. 运维人员的军刀——ROS
  10. Address already in use:9191