在NotePad的实例中,点击Listview里面的选项会执行 onListItemClick方法,下面我们看看这个方法的实现:
@Override protected void onListItemClick(ListView l, View v, int position, long id) { // TODO Auto-generated method stub super.onListItemClick(l, v, position, id); Cursor c = mNotesCursor; c.moveToPosition(position); Intent intent = new Intent(this, NoteEdit.class); intent.putExtra(NoteDbAdapter.KEY_ROWID, id); intent.putExtra(NoteDbAdapter.KEY_TITLE, c.getString(c.getColumnIndexOrThrow(NoteDbAdapter.KEY_TITLE))); intent.putExtra(NoteDbAdapter.KEY_BODY, c.getString(c.getColumnIndexOrThrow(NoteDbAdapter.KEY_BODY))); startActivityForResult(intent, ACTIVITY_EDIT); }
- putExtra方法添加附加信息到intent中。
- startActivityForResult中第二个参数要>=0,并且在onActivityResult方法中会返回这个值。
启动NoteEdit后,输入一些信息,点击提交按钮,会把结果返回到前面的Activity中。
package com.hebaijun.notepad; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; public class NoteEdit extends Activity{ private EditText titleEditText; private EditText bodyEditText; private Long noteID; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.note_edit); setTitle(R.string.edit_note); titleEditText = (EditText) findViewById(R.id.title); bodyEditText = (EditText) findViewById(R.id.body); Button confirm = (Button) findViewById(R.id.confirm); noteID = null; Bundle bundle = getIntent().getExtras(); if (bundle != null) { String title = bundle.getString(NoteDbAdapter.KEY_TITLE); String body = bundle.getString(NoteDbAdapter.KEY_BODY); noteID = bundle.getLong(NoteDbAdapter.KEY_ROWID); if (title != null) { titleEditText.setText(title); } if (body != null) { bodyEditText.setText(body); } } confirm.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Bundle bundle = new Bundle(); bundle.putString(NoteDbAdapter.KEY_TITLE, titleEditText.getText().toString()); bundle.putString(NoteDbAdapter.KEY_BODY, bodyEditText.getText().toString()); if (noteID != null) { bundle.putLong(NoteDbAdapter.KEY_ROWID, noteID); } Intent mIntent = new Intent(); mIntent.putExtras(bundle); setResult(RESULT_OK, mIntent); finish(); } }); } }
- getIntent().getExtras()方法取得传递过来的Intent的附加信息。
- onClick方法中,setResult方法返回结果给调用它的Activity。第一个参数通常是RESULT_CANCELED或者 RESULT_OK,在onActivityResult方法的第二个参数resultCode可以取得这个值。
- finish()方法在activity完成并且需要关闭的时候调用,调用后会把信息返回到调用它的activity的onActivityResult方法中。
看看onActivityResult方法:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); Bundle bundle = data.getExtras(); switch (requestCode) { case ACTIVITY_CREATE: String noteName = bundle.getString(NoteDbAdapter.KEY_TITLE); String noteBody = bundle.getString(NoteDbAdapter.KEY_BODY); mDbHelper.createNote(noteName, noteBody); fillData(); break; case ACTIVITY_EDIT: Long rowId = bundle.getLong(NoteDbAdapter.KEY_ROWID); if (rowId != null) { String editTitle = bundle.getString(NoteDbAdapter.KEY_TITLE); String editBody = bundle.getString(NoteDbAdapter.KEY_BODY); mDbHelper.updateNote(rowId, editTitle, editBody); } fillData(); break; default: break; } }
- requestCode是 startActivityForResult方法执行是传递过去的值,通过这个值,我们可以判断是哪个组件返回了结果。
- resultCode是通过 setResult方法返回的值,作用是告知返回状态,是成功还是取消等等。
- onActivityResult会在onResume方法前执行。