Android入门开发指南之七 -- 指南:Notepad 练习1 (上)

  
在这个练习中,你将创建一个简单的文本列表,让用户添加文本但是不能编辑它们,这个例子演示了 :
·          ListActivities 的基本用法,创建和处理菜单选项。
·          如何访问和保存文本到 SQLife 数据库中。
·          如何使用 ArrayAdapter (最简单的绑定 ListView 的方法)绑定相互聚到一个 ListView
·          基本的屏幕布局,包括如何布局列表视图,如何添加条目到实体菜单,尸体如何处理这些菜单的选种动作。
[Exercise 1] [Exercise 2] [Exercise 3] [Extra Credit]
1
Eclipse 中打开 Notepadv1 工程。
Notepadv1 工程提供一个起点,它关心的事建立样板文件的工作,如果你学习过 Hello Android tutorial 例子,你对这些应该比较熟悉。操作步骤如下:
a.      在包浏览器中右击,选择 导入 ../ 一般 / 现有工程 进入工作区。
b.      点击浏览按钮,移动到你复制三个练习的文件夹,选择 Notepadv1 文件夹,然后点击 OK.
c.       你将看到 Notepadv1 列在工程列表中,并且后面带有一个选择框。
d.      点击结束。
e.      这个练习工程将打开并且列出在 Eclipse 的包浏览器中。
f.         如果你看到一个关于 AndroidManifest.xml 的错误,或者其它关于 Android 压缩文件的错误,右击工程从弹出菜单中选择 Android Tools-> Fix Project Properties (对库文件而言,工程处在不正确的未知,这样操作可以修复它)。
2
访问和修改数据
这个练习中,我们将使用一个 SQLite 数据库来直接保存我们的数据,但是在实际的应用,使用一个合适的 ContentProvider 简化这个行为的方法更为普遍。
如果你感兴趣,你可以找到关于 content providers 的更多信息,或者你可以参考关于存储,获得和刷新数据的主题。
注意这个类 DBHelper --- 这个类提供来压缩数据到一个 SQLite 数据库来保存我们的文本数据并且允许我们更新它。
典型情况下你将使用 ContrentProvider 来执行,事实上,在 SDK 中的完整的 Notepad 应用就是执行的这样一个 ContentProvider 。然而,没有理由你不和我们这里一样直接使用自己的 SQLite 数据库。关键值得注意的问题是这个类为我们提供的存储,获取和更新 SQLite 数据库中的数据的细节。许多方法又来获取多行,根据行标识获取一行,创建一个新的行,删除一个存在的行和更新一行数据。如果你想获取如何在我们的应用中使用 SQLite 数据库的指南,你可以详细阅读这个类的文档或者,更好的办法就是,查看 SDK samples/ 目录下的 Notepad 应用程序时如何使用 ContentProvider
3
布局和实体
许多实体都关联一个布局。布局是实体面向用户的脸面。在这个例子中,我们的布局将布满全屏并且提供一个文本列表。
全屏布局不是实体唯一的选择。你可以参考一个浮动布局(例如,一个对话框或者警告栏),或者某些情况下你根本就不需要布局(实体将对用户隐藏直到你为它指定某个布局)。
打开 res/layout 目录下的 notepad_list.xml 文件来查看:这是一个布局定义文件,带有一个默认的起点,我们提供了注解方便你更快的掌握它:
a.      所有的 Android 布局文件都以 XML 行开头 <?xml version="1.0" encoding="utf-8"?>
b.      同样下面的定义通常是一些布局文件的定义,在这个例子中是 LinearLayout
c.       注意在 Android 中的 xml 名字空间应当定义在最外层的布局中,因此 android:tags 就可以用在甚于的文件中。
 
4
 
我们需要创建布局来容纳我们的列表。调价代码到 LinearLayout 标签中,因此整个文件看起来就像是这个样子的:(你可能需要顺序点击 source tab 页来编辑这个 xml 文件)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
 
 <ListView id="@id/android:list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
 <TextView id="@id/android:empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/no_notes"/>
 
</LinearLayout>
a.      ListView TextView 可以作为两个可切换的视图,每次只能显示一个。 ListView 用来显示文本列表,而 TextView( 是一个字符串资源,默认值为 ”No Notes Yet!”, 如果没有文本是显示这个字符串 )
b.      ListView TextView 字符串中的 @ 字符表示 XML 分析器将使用一个资源标识来分析和展开字符串中剩余的部分。
c.       android:list android:empty Android 平台为我们提供的标签,当列表适配器中没有数据时, empty 默认参数。列表适配器知道去搜索默认的特殊字。可选择的做法是,你可以使用列表适配器的 setEmptyView() 方法 选择改变默认的 empty 视图。更广泛的是, android.R 类是系统提供的一套预定义资源,而你的工程的 R 类是一套你自己定义的资源。 Android.R 资源类中存在的西元可以 XML 文件中使用,方法是 android: 名字空间前缀(就像我们看到的那样)。
5
资源和 R
Eclipse 工程中的 res/ 目录比较特殊。这个目录以及其下的文件有一个特殊的结构。
特殊地方就是,定义在这些文件夹和文件中的资源在 R 类中都有相应的入口,可以允许它们被你的应用程序简单地访问。此外,它们被绑定和配置为应用程序的一部分。
为了生成一个视图,我们需要定义视图列表中的每一行:
a.      res/ 下创建一个新的文件布局,名字为 notes_row.xml.
b.      添加下列内容 ( 注意 :xml 头再一次使用,第一个节点定义 Android xml 名字空间 )
c.         <?xml version="1.0" encoding="utf-8"?>
d.         <TextView id="@+id/text1"
e.             xmlns:android="http://schemas.android.com/apk/res/android"
f.             android:layout_width="wrap_content"
g.             android:layout_height="wrap_content"/>
     
h.       这是每一个文本标题行所使用的视图,它只有一个文本域。
i.         在这个例子中,我们新建了一个新的标识叫做 text1, 标识字串中 ’@’ 后的 ’+’ 标示如果没有存在的标识,那么将自动创建,所以我们在上面定义和使用 text1 作为标识。
j.         保存文件后,打开工程中的 R.java 类进行观察,你会发现关于 notes_row text1 的新定义(我们自己定义,非系统自动生成),这意味着我们能够从我们的代码中获取访问。
6
接着,打开源代码中的 Notepadv1 类,我们继续修改这个类,让它成为一个列表适配器并且能够显示我们的文本文件,同时能让我们添加新的文本文件。
Notepadv1 作为 Activity 的子类调用 ListActivity, 它有强大的功能,能提供列表实现你所希望的功能,例如:多行显示一个任意数量的列表项在屏幕上,移动列表项,允许它们被选中等等。仔细观察 Notepadv1 类中的代码,顶部有许多常量定义,接下来就是我们用来创建文本标题的私有域,还有一些超类方法的重写方法。
7
Notepadv1 的集成类从 Activity 修改为 ListActivity ,定义如下:
public class Notepadv1 extends ListActivity
注意 : 你必须导入 ListActivity 到你的 Notepadv1 类中,在 Eclipse 中,在 Windows Linux 下你可以使用 ctrl-shift-O 的快捷键,或者在 Mac organize imports )中使用 cmd-shift-O 完成相同的功能。
 
8
已经有三个重写的方法定义: onCreate onCreateOptionsMenu onOptionsItemSelected ,我们将填入我们的代码。
·          onCreate() activity 启动时调用 它对 activity 的作用有一点像 ’main’ 函数。当它启动时,我们使用这个来为 activity 建立资源和状态。
·          onCreateOptionsMenu() 用来为 activity 创建菜单。当用户点击 menu 按钮是显示,你可以选择弹出来的一组选项(比如 ”Create Note” )。
·          onOptionsItemSelected() 是菜单功能实现的另外一个重要部分,它用来处理从菜单中生成的事件 ( 例如,当用户选择 ”Create Note” 项时 )

猜你喜欢

转载自blog.csdn.net/wellshine/article/details/1904644