关于使用意图传递数据的问题

时间:2010-04-19 12:27:01

标签: android android-intent

我正在尝试修改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类获取此值?如果这对你们所有人来说都是一个简单的问题,那我就是新手了。很抱歉。

谢谢,

2 个答案:

答案 0 :(得分:1)

使用Intent启动其他活动时,接收活动必须使用getIntent()方法来访问它;没有理由将savedInstanceState用于此目的;这只有在“恢复”活动的当前状态时才有用,因为它被中断了。

您可以使用发送活动中Intent的“额外内容”来传输您要发送的数据。接收活动使用相同的额外名称来获取数据。此外,永远不要假设所有额外内容都已发送(即检查null s!)

您应该在接收活动的onCreate方法中做出有关活动操作的所有决定。

如果活动可以多种方式“启动”,则必须在Intent.setAction()中使用Intent,并在接收活动中检查所有有效操作。

此外,不要依赖id中的onListItemClick参数,这通常是不正确的。 position参数始终是正确的,您可以使用它从适配器获取实际项目,并从项目中获取ID。通常,一个设置Intent的数据URI,而不是发送ID作为额外的;这对于系统的活动分辨率更有效(见下文)。

事实上,“数据操作”活动应支持数据编辑的标准操作INSERTEDIT等,并具有指定这些操作和数据的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时,问题就出现了