我正在尝试修改Notepad教程(Notepadv3解决方案),以便将一个值输入NoteEvit类,由Notepadv3类提供。我已成功在OnListItemClick方法中使用.putExtra将值放入NoteEdit类中,但我正在努力为createNote方法执行此操作;当我尝试创建一个新音符时,我正在接近一个力量。
我敢打赌这是一个简单的解决方案,但我对Java& Android,非常感谢您的帮助。
以下是Notepadv3类中的相关代码:
private void createNote() {
Intent i = new Intent(this, NoteEdit.class);
i.putExtra("key", 1);
startActivityForResult(i, ACTIVITY_CREATE);
}
@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);
i.putExtra("key", 1);
startActivityForResult(i, ACTIVITY_EDIT);
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
fillData();
}
这是NoteEdit类中的接收代码:
mRowId = savedInstanceState != null ? savedInstanceState.getLong(NotesDbAdapter.KEY_ROWID)
: null;
if (mRowId == null) {
Bundle extras = getIntent().getExtras();
mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID)
: null;
value = extras.getInt("key");
}
当我使用createNote方法时,我很确定(mRowId == null)不正确,因此不会调用getExtras。我的一个问题是,当我使用createNote方法时,如何让我的NoteEdit类获取此值?如果这对你们所有人来说都是一个简单的问题,那我就是新手了。很抱歉。
谢谢,
乔
答案 0 :(得分:1)
使用Intent
启动其他活动时,接收活动必须使用getIntent()
方法来访问它;没有理由将savedInstanceState
用于此目的;这只有在“恢复”活动的当前状态时才有用,因为它被中断了。
您可以使用发送活动中Intent
的“额外内容”来传输您要发送的数据。接收活动使用相同的额外名称来获取数据。此外,永远不要假设所有额外内容都已发送(即检查null
s!)
您应该在接收活动的onCreate
方法中做出有关活动操作的所有决定。
如果活动可以多种方式“启动”,则必须在Intent.setAction()
中使用Intent
,并在接收活动中检查所有有效操作。
此外,不要依赖id
中的onListItemClick
参数,这通常是不正确的。 position
参数始终是正确的,您可以使用它从适配器获取实际项目,并从项目中获取ID。通常,一个设置Intent
的数据URI,而不是发送ID作为额外的;这对于系统的活动分辨率更有效(见下文)。
事实上,“数据操作”活动应支持数据编辑的标准操作INSERT
,EDIT
等,并具有指定这些操作和数据的MIME类型的intent过滤器。我很确定这些是示例应用程序的一部分。
在接收活动中,您必须致电Activity.setResult()
,并且您通常会通过另一个Intent
发回返回数据(例如新内容网址),然后您可以通过{{1}中的发送活动访问该数据}}。此外,您必须在适当的时间致电onActivityResult()
;例如在生命周期退出(setResult()
或onPause()
)期间调用它为时已晚,并且不会传回结果。
答案 1 :(得分:0)
if (mRowId == null) {
Bundle extras = getIntent().getExtras();
mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID)
: null;
if (mRowId == 0) mRowId = null;
value = extras.getInt("key");
}
像这样修改代码。问题是调用createNote会创建一个mRowId为null的新注释。但是,由于您传递的是“key”参数,因此extras不会为null,但它既没有KEY_ROWID值,也没有getLong()默认返回0。当您在populateFields()
中查询_id = 0时,问题就出现了