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

时间:2012-03-07 15:37:41

标签: android android-intent bundle

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

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

我理解* Bundle.getLong(“_ id”); *如果没有与intent一起传递额外,则应该返回null。我的问题是,由于某种原因,getLong()总是返回0.我尝试将一些乱码作为getLong()的关键字符串,但它仍然返回0.有没有人遇到过这个问题?

我还想补充一点,我还有两组与此类似的活动,使用相同的方法获取rowId(如果已经通过),它们都可以正常工作。

我无法找到任何可能导致此问题的常见问题。提前感谢您的帮助。

[编辑]

对于任何令人困惑并且之前未显示此代码的道歉。正如一些人评论说,如果getLong找不到任何东西,它将返回0,但是我使用的代码将mRowId设置为null,如果是这种情况,或者至少我认为它确实如此。这有点让我感到困惑,但是当没有其他额外的意图传递时,它似乎有效。

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

我还有另一个混乱,发现如果任何额外的值与intent一起传递(无论其键是什么),它将导致它返回0而不是null。我假设如果传递另一个额外的代码,则此代码不起作用。如果是这种情况,如果有必要,有更好的方法来传递rowId,如果没有传递则将其设置为null。

3 个答案:

答案 0 :(得分:7)

实际上,文档说如果找不到映射,则返回“0L”。 http://developer.android.com/reference/android/os/Bundle.html#getLong(java.lang.String)

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

您可以使用此: http://developer.android.com/reference/android/os/Bundle.html#getLong(java.lang.String,%20long)

,您可以在其中定义未找到密钥时要接收的默认值(例如-1)。

答案 1 :(得分:2)

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

//This is valid Java code
int a = 5;
Integer b = a;

你有2个解决方案:

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

2)使用函数getLong(String key,long defaultValue)。将默认值设置为某个永远不会在您的应用中使用的常数。然后,如果函数返回此值,则表示密钥不存在。只有在您可以保证永远不会是有效数据的长值时才可以这样做。

答案 2 :(得分:0)

捆绑与意图不同。你必须使用getIntent()。getExtras()。getLong()。 (假设你混淆了并且正在使用已保存的实例)