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

Android 关于使用意图传递数据的问题,android,android-intent,Android,Android Intent,我正试图修改记事本教程(Notepadv3解决方案),以便在NoteEdit类中引入一个值,该值由Notepadv3类提供给。我已经成功地在OnListItemClick方法中使用了.putExtra将值放入NoteEdit类,但是我很难为createNote方法做到这一点;当我试图创造一个新的音符时,我得到了一个接近的力 我打赌有一个简单的解决方案,但我对Java和Android还很陌生,非常感谢您的帮助 下面是Notepadv3类中有问题的代码: private void createNot

我正试图修改记事本教程(Notepadv3解决方案),以便在NoteEdit类中引入一个值,该值由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");

    }
我相当确定(mRowId==null)在使用createNote方法时不是真的,因此不会调用getExtras。我的一个问题是,当我使用createNote方法时,如何使我的NoteEdit类获得这个值?我是新手,如果这对你们来说是个简单的问题,我很抱歉

谢谢


Joe

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

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

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

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

另外,不要依赖于
onListItemClick
中的
id
参数,这通常是不正确的。
position
参数始终正确,您可以使用它从适配器获取实际项目,并从项目获取ID。通常,设置
Intent
的数据URI,而不是将ID作为额外信息发送;这与系统的“活动解析”(Activity resolution)配合使用效果更好(见下文)

事实上,“数据操纵”活动应该支持数据编辑的标准操作、
插入
编辑
等,并具有指定这些操作和数据MIME类型的意图过滤器。我很确定这些都是示例应用程序的一部分

在接收活动中,您必须调用
activity.setResult()
,通常通过另一个
Intent
返回数据(例如新内容URL),然后从
onActivityResult()
中的发送活动访问返回数据。此外,必须在适当的时间调用
setResult()
;e、 g.在生命周期退出期间调用它(
onPause()
onStop()
)太迟了,不会将结果传回

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时,问题会出现。

使用adb logcat、DDMS或Eclipse中的DDMS透视图来查看与“强制关闭”相关联的Java堆栈跟踪,以查看发生故障的位置。是的,我在DDMS透视图上查看了logcat,似乎向我跳出来的是:04-19 14:40:05.640:ERROR/AndroidRuntime(18951):未捕获处理程序:线程主线程由于未捕获异常而退出04-19 14:40:05.760:ERROR/AndroidRuntime(18951):java.lang.RuntimeException:无法启动活动组件信息{com.example.listview/com.example.listview.NoteEdit}:android.database.CursorIndexOutOfBoundsException:请求索引0,大小为0,因此是光标问题?我确信这与(mRowId==null)不是真的有关。有什么想法吗?
savedInstanceState
当您的活动通过
startActivity()
(或
startActivityForResult()
)启动时,应该是
null
。因此,如果在调用
createNote()
时,您认为
mRowId
是从
savedInstanceState
设置的,那么在某个地方出现了相当严重的问题。您认为我应该尝试使用.putExtra在OnCreate中传递不同的值或变量名吗?(即i.putExtra(“键二”,1)或者我理解的意图和额外内容是错误的吗?不知道如何继续。如果你查看错误日志,你会发现它给出了问题代码中的确切行号。行号与每个软件包相关,但你可以非常确定错误不在操作系统的某个软件包中。因此,请查找问题的第一个实例s、 然后找到行号。在我的SDK示例中,这个示例的包名是com.android.demo.notepadv3,但您可能已经更改了它。