记事本3
fangyukuan
2010-4-9
完善第二个例子。学习目标:
l事件生命周期
l维持应用程序状态
1)NoteEdit
在onCreate删除以下代码。即我们不再需要从意图取得标题和内容,我们只需要从意图取得行ID就行了。然后用行的ID去数据取,标题和内容。
String title = extras.getString(NotesDbAdapter.KEY_TITLE);
String body = extras.getString(NotesDbAdapter.KEY_BODY);
if (title != null)
{
mTitleText.setText(title);
}
if (body != null)
{
mBodyText.setText(body);
}
在NoteEdit 类加数据成员
private NotesDbAdapter mDbHelper;
在onCreate里super.onCreate()后面加以下代码,因为我们要用到数据库。
mDbHelper = new NotesDbAdapter(this);
mDbHelper.open();
在confirmButton.setOnClickListener()之前调用()方法。
在NoteEdit 类加方法populateFields
// 根据行号从数据库取标题和内容
private void populateFields()
{
if (null != mRowId)
{
Cursor note = mDbHelper.fetchNote(mRowId);
startManagingCursor(note);
mTitleText.setText(note.getString(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
mBodyText.setText(note.getString(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
}
}
因为我们在点击确定的时候,不再需要返回结果,所以我们把onClick的代码做相应修改:
public void onClick(View view)
{
Bundle
bundle = new Bundle();
bundle.putString(NotesDbAdapter.KEY_TITLE, mTitleText.getText()
.toString());
bundle.putString(NotesDbAdapter.KEY_BODY, mBodyText.getText()
.toString());
if (mRowId != null)
{
bundle.putLong(NotesDbAdapter.KEY_ROWID, mRowId);
}
Intent
mIntent = new Intent();
mIntent.putExtras(bundle);
setResult(RESULT_OK, mIntent);
finish();
}
改成:
public void onClick(View view)
{
setResult(RESULT_OK);
finish();
}
重写三个方法onSaveInstanceState(), onPause() and onResume()
// 当Activity在恢复之前被杀掉时,Android会调用这个方法。
// 所以我们可以在这里保存一些信息,以使下次重新启动时恢复到现在的状态
// 参数outState 跟onCreate的参数savedInstanceState是一样的
@Override
protected void
onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
outState.putLong(NotesDbAdapter.KEY_ROWID, mRowId);
}
// 当Activity结束时onPause会被调用(比如说finish方法调用时)
// 很多时候我们可以在这里释放资源
// 我们在这里把数据保存到数据库里
@Override
protected void onPause()
{
super.onPause();
saveState();
}
// 这个就是Activity恢复的时候会被调用
@Override
protected void onResume()
{
super.onResume();
populateFields();
}
2)
Notepadv3
类
因为记事本的存取我们都在NoteEdit
里做了。所以在onActivityResult里我们只需要更新一下视图的数据。而不用再做其它的事。所以把数据库相关的操作删除掉。
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent intent)
{
super.onActivityResult(requestCode, resultCode,
intent);
fillData();
}
删除方法onListItemClick以下代码。当点击某一列时,我们只需要把行ID,放进意图里。不再需要把标题和内容也放进去。因为用行ID可以在数据查找到标题和内容。
Cursor c = mNotesCursor;
c.moveToPosition(position);
i.putExtra(NotesDbAdapter.KEY_TITLE, c.getString(c
.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
i.putExtra(NotesDbAdapter.KEY_BODY, c.getString(c
.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
修改之后:
@Override
protected void
onListItemClick(ListView l, View v, int position, long id)
{
super.onListItemClick(l, v, position, id);
Intent i = new Intent(this, NoteEdit.class);
i.putExtra(NotesDbAdapter.KEY_ROWID, id);
startActivityForResult(i, ACTIVITY_EDIT);
}
修改方法fillData以下代码:
mNotesCursor = mDbHelper.fetchAllNotes();
把mNotesCursor改成局部变量。当然相应的mNotesCursor也得改成局部变量notesCursor(记得把mNotesCursor定义也删除掉)
Cursor notesCursor = mDbHelper.fetchAllNotes();