Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无论键字符串是什么,extras.getLong()似乎都返回0_Android_Android Intent_Bundle - Fatal编程技术网

Android 无论键字符串是什么,extras.getLong()似乎都返回0

Android 无论键字符串是什么,extras.getLong()似乎都返回0,android,android-intent,bundle,Android,Android Intent,Bundle,在我目前正在开发的一个应用程序中,我的第一个活动带有一个ListView,它是从保存到应用程序内存中的ArrayList填充的。通过使用菜单按钮选择“添加”或点击菜单中的现有项目,我可以进入第二个活动,即编辑页面 在第一个活动中,如果按下“添加”按钮,则不会在“意图”中传递额外内容,编辑活动中也不需要填写任何字段(文本框等)。如果在第一个活动中单击了现有项,则会将该项的行ID作为Intent中的额外项传递,键字符串为“\u ID” 我理解*Bundle.getLong(“_id”);*如果未传递

在我目前正在开发的一个应用程序中,我的第一个活动带有一个ListView,它是从保存到应用程序内存中的ArrayList填充的。通过使用菜单按钮选择“添加”或点击菜单中的现有项目,我可以进入第二个活动,即编辑页面

在第一个活动中,如果按下“添加”按钮,则不会在“意图”中传递额外内容,编辑活动中也不需要填写任何字段(文本框等)。如果在第一个活动中单击了现有项,则会将该项的行ID作为Intent中的额外项传递,键字符串为“\u ID”

我理解*Bundle.getLong(“_id”);*如果未传递额外的意图,则应返回null。我的问题是,出于某种原因,getLong()总是返回0。我尝试将一些乱码作为getLong()的键字符串,但它仍然返回0。以前有人遇到过这个问题吗

我还想补充一点,我还有另外两组类似的活动,使用相同的方法来获取rowId(如果它已被传递),它们都工作得很好

我还没有找到任何可能导致这种情况的常见问题。提前感谢您的帮助

[编辑]

对于之前出现的任何混淆和未显示此代码,我深表歉意。正如一些人所评论的那样,如果getLong找不到任何东西,它将返回0,但是如果是这种情况,我使用的代码将mRowId设置为null,或者至少我假设它会。这有点让我困惑,但当并没有其他额外的东西被有意传递时,它似乎起了作用

mRowId = extras != null
? extras.getLong("_id")
: null;

我还遇到了另一个麻烦,发现若有任何额外的值是通过意图传递的(不管它的键是什么),它将导致它返回0而不是null。如果传递了另一个额外的代码,我假设此代码不起作用。如果是这种情况,是否有更好的方法在必要时传递rowId,如果未传递任何内容,则将其设置为null。

捆绑包与目的不同。您必须使用getIntent().getExtras().getLong()。(假设你搞混了,正在使用savedinstance)

实际上,文档会说,如果找不到映射,则返回“0L”。

(类型“long”也是一个原语,不能为null)

你可以用这个:


在其中,您可以定义一个默认值,以便在找不到键时接收(例如-1)。

这里的问题是,如果找不到映射,它应该返回0。函数getLong()返回一个long原语,该原语不能为null。如果要将它映射到一个长对象,它仍然会有一个零值,因为您只是传递一个0值。Java足够聪明,可以将原语值分配给相应的box对象。例如:

//This is valid Java code
int a = 5;
Integer b = a;
您有两种解决方案:

1) 如果您绝对需要一个空值,那么您可以扩展自己的长包装器类,该类扩展了Parcelable接口。然后,当您可以调用Bundle.getParcelable(“key”)时,如果密钥不存在,您将得到一个空值


2) 使用函数getLong(字符串键,long defaultValue)。将默认值设置为某个永远不会在应用程序中使用的常量。然后,如果函数返回此值,则知道该键不存在。这只有在你能保证一个长值永远不会是有效数据的情况下才可能。你应该为
意图
创建和你活动的
onCreate发布代码。哎呀,你的文章的最后一部分没有正确阅读。放置日志以确保设置正确,这也可能是一个问题,取决于backbackback中是否已经存在该活动-它可能使用了旧的意图?似乎当传递任何额外的意图时,无论键字符串是什么,都会导致getLong返回0而不是null。我传递了一个不同的额外信息,名为“_stateId”。我假设它与我正在搜索的“_id”字符串不同,这意味着它将返回null。但是我刚刚删除了另一行,现在它可以正常工作了。它实际上使用了Long类型,是一个包装原语Long的对象。你从哪里看到的?getLong()的方法签名指示它返回“long”类型,而不是“long”。但是我没有查看Android源代码,所以可能在幕后它实际上使用了很长的时间。无论如何,它返回0且不为null这一事实是文档中所说的。我在几本书中读到过这个方法,这些书在从listview中选择一个项目后引用填充字段。它确实有效,在另一个答案中,我只是解释了为什么我认为它会这样做。看起来,若有任何额外的消息被传递,它将返回0而不是null。当我删除putExtra()时,它按预期返回null。我只需要弄清楚如何传递我需要的两个参数,但这没有意义。原语long不能为null。那么getLong()如何为您返回null呢?我认为您应该发布活动创建、意图设置等的代码,以便我们更好地理解:)@williamsterwart它永远不会像您尝试的那样工作。请阅读我的帖子以获得更多澄清。您之所以在没有按意图传递putExtra()方法的情况下获得null,是因为您的Bundle为null。感谢您的帮助,使用带有默认值的getLong方法可以工作。