第
9
步
在
onCreate()
方法中添加代码。
这里我们将设置
activity
的标题
(
显示在屏幕顶端
)
,使用
notepad_list
布局,我们为
activity
创建显示内容,建立
DBHelper
实例用来访问数据,然后将可显示的文本标题和列表关联起来。
a.
调用
super()
带
icicle
参数,传入到我们的方法中。
b.
在
R.layout.notepad_list
中调用
setContentView
。
c.
为类
DBHelper
创建一个新的名为
dbHelper
的私有类成员(放在
onCreate
方法之前)。
d.
在
onCreate
方法后面,构造一个
DBHelper
实例,并分配
dbHelper
成员(注意:你必须传递
this
引用到
DBHelper
的构造函数中)。
e.
最后,调用一个新的方法
fillData()-
获取数据平且使用
helper
进行关联,我们在这里还没有定义它。
f.
onCreate()
现在看起来应该像这个样子:
g.
@Override
h.
public void onCreate(Bundle icicle)
i.
{
j.
super.onCreate(icicle);
k.
setContentView(R.layout.notepad_list);
l.
dbHelper = new DBHelper(this);
m.
fillData();
n.
}
同时记住添加
DBHelper
成员定义(在
NoteNumber
定义中)。
private DBHelper dbHelper;
第
10
步
更多菜单内容
我们构建的
Notepad
应用仅仅触及到菜单的表面。你还可以为你的菜单添加菜单项,创建子菜单甚至是添加菜单项到其它应用中。
在
onCreateOptionsMenu()
函数体中填入代码。
我们将只添加一个菜单项,
”Add Item”,
使用我们在
string.xml
中创建,使用一个常量定义的字符创。我们将创建在类的顶部,用来标识添加菜单项的操作。
a.
在
strings.xml
资源中
(
在
res/valuse
目录下
)
,为
menu_insert
添加一个新的字符串,文本为
”Add Item”,
<string name="menu_insert">Add Item</string>
,
然后保存这个文件。
b.
同样,你需要一个菜单位置长廊,在
Notepadv1
类的顶部(刚好在
KEY_BODY
定义下面)
public static final int INSERT_ID = Menu.FIRST;
c.
在方法
onCreateOptionsMenu()
中,添加菜单项。同样注意
super
调用返回的结果,整个完成之后的方法看上去应该像这个样子
:
d.
@Override
e.
public boolean onCreateOptionsMenu(Menu menu) {
f.
boolean result = super.onCreateOptionsMenu(menu);
g.
menu.add(0, INSERT_ID, R.string.menu_insert);
h.
return result;
i.
}
第
11
步
在
onOptionsItemSelected()
方法中添加代码:
这个方法用来处理我们新的
”Add Note”
菜单项的选择动作。当这个选中的方法调用
item.getID()
获得的值为
INSERT_ID
(我们用来标识菜单项)时,我们可以检测到用户选择菜单动作,并且执行适当的处理。
a.
super.onOptionsItemSelected(item)
方法在这个函数结尾运行
-
我们希望能够首先捕获我们的事件。
b.
返回值上的
Switch
语句
c.
case INSERT_ID:
d.
调用方法
createNote()
e.
在
case
语句结束处添加
break;
f.
在函数末尾返回
superclass
onOptionsItemSelected()
的返回值。
g.
现在整个
onOptionsItemSelect()
函数看起来像这个样子:
h.
@Override
i.
public boolean onOptionsItemSelected(Item item) {
j.
switch (item.getId()) {
k.
case INSERT_ID:
l.
createNote();
m.
break;
n.
}
o.
p.
return super.onOptionsItemSelected(item);
q.
}
第
12
步
添加一个新的
createNote()
方法
:
在应用程序的第一版中,
createNote()
不是非常有用
.
我们将简单创建一个带标题的文本,标题基于一个计数器
(“Note1”,”Note2”)
,文本正文为空。现在我们还没有办法编辑文本内容,所以现在我们将创建一个带默认值的文本。
a.
字符串
noteName = “Note” + noteNumber++; (
使用
”Note”
和我们在类里面定义得计数器构造名字
);
b.
使用
noteName
作为标题,空字符
””
作为正文调用函数
dbHelper.createRow()
c.
Call
fillData()
method again after adding (inefficient but simple)
d.
The whole
createNote()
method should look like this:
e.
private void createNote() {
f.
String noteName = "Note " + noteNumber++;
g.
dbHelper.createRow(noteName, "");
h.
fillData();
i.
}
第
13
步
列表适配器
我们例子使用了一个简单的数组适配器,它将一个数组或者列表元素绑定到一个
ListView,
在
Android
中更通用的做法是,列表适配器和
ContentPorvider
一起工作,这也是一个使用列表的非常简单的方法。
绑定一个
ContentProvider
到一个
ListView
,你可以使用一个
android.widget.SimpleCuresorAdapter
来绑定
contertProvider
中提供的数据到
ListView
。
定义
fillData
方法,这个过程相对长一点:
这个方法使用
ArrayAdapter
,
它是最简单的将数据导入
ListView
中的方法。
ArrayAdapter
不仅获取一个列表或者字符串数组,还把它们绑定到一个文本视图中,这个视图在布局中定义为列表行(这个就是我们的
notes_row.xml
布局中的
text1
域)。这个方法简单的从
helper
数据库中获取一列文本,使用每一行的文本标题构造一个字符串列表,然后在这些列表项之上创建一个
ArrayAdapter
,然后绑定我们定义的
notes_row.(
The method simply obtains a list of notes from the database helper, constructs a List of Strings using the title strings from each row, and then creates an
ArrayAdapter
out of those items and bound to use the
notes_row
we defined.
没有完全理解
)
。
private void fillData() {
// We need a list of strings for the list items
List<String> items = new ArrayList<String>();
// Get all of the rows from the database and create the item list
List<Row> rows = dbHelper.fetchAllRows();
for (Row row : rows) {
items.add(row.title);
}
// Now create an array adapter and set it to display using our row
ArrayAdapter<String> notes =
new ArrayAdapter<String>(this, R.layout.notes_row, items);
setListAdapter(notes);
}
a.
ArrayAdapter
需要一个字符串列表
(
List<String>
)
,包含要显示的项。
b.
数据从数据库中一行行读出,每一行的标题域构成列表字符串。
c.
我们指定我们创建的
notes_row
视图作为数据容器。
d.
如果你发现没有报告过的类错误,你可以按组合键
ctrl-shift-O(
在
Mac
上是
cmd-shift-O)
生成错误报告。
注意:在这个联系中,我们使用了一个
ArrayAdapter
,这并不是一个通用的做法,更典型的做法是,使用一个
SimpleCursorAdapter
和
ContentProvider
,或者至少从一次查询中返回一个
Cursor
,查看
List Adapters
上的工具条获取更多的信息。
第
14
步
运行程序!
a.
在工程
Notepadv1
上右击
b.
从弹出菜单中选择
Run As -> Android Application
c.
如果你看到一个对话框弹出来,选择
Android
启动器作为运行应用程序的方法
(
你也可以使用对话框顶部的链接作为你的工作区的默认值,这是推荐使用的,因为它可以组织插件每次运行时等询问
)
。
d.
点击菜单按钮,从菜单中选择
”Add item”
添加新的文本。
解决方案以及下一步
你可以拿你自己的实现方法与
zip
文件中
Notepadv1Solution
的类实现办法作比较,一旦你完全掌握,让我们进入指南练习
2
中,添加创建,编辑和删除文本的功能。
返回指南主页进入下一个练习。