2012-03-07 41 views
0

在我目前正在對我有我與從保存在應用程序內部存儲器的ArrayList填充一個ListView第一個活動的應用程序。通過使用菜單按鈕選擇「添加」或通過點擊菜單中的現有項目,我可以進入我的第二個活動,這是一個編輯頁面。extras.getLong()似乎返回0,無論密鑰字符串是什麼

在第一個活動,如果按下Add按鈕,沒有額外的意圖通過,沒有任何字段(文本框等)需要在編輯活動填補。如果在第一個活動中單擊現有項目,則會將該項目的行ID作爲額外Intent中的一部分傳遞,密鑰字符串爲「_id」。

我明白,* Bundle.getLong(「_ ID」);如果沒有額外的已通過其意圖*應該返回null。我的問題是,由於某種原因,getLong()總是返回0.我試着把一些亂碼作爲getLong()的關鍵字符串,但它仍然返回0.有沒有人遇到過這個問題?

我還想補充一點,我有其他兩組類似這樣的活動,用同樣的方法來獲取ROWID,如果它已經過去了,他們都做工精細。

我一直沒能找到任何可能導致此問題的常見問題。預先感謝您的幫助。

[編輯]

任何混亂道歉和未示出先前此代碼。正如少數人評論的getLong將返回0,如果它找不到任何東西,但是我使用的代碼將mRowId設置爲null,如果是這種情況,或者至少我假設它。這一點有點混淆了我的,但它似乎工作時沒有其他額外的意圖通過。

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

我也有另一個爛攤子四周,發現如果任何額外的價值與目的(無論其鍵),通過它,則它會返回0,而不是空。我假設這個代碼不起作用,如果另外一個額外的通過。如果情況是這樣的話,是否有更好的方法可以在必要時傳遞rowId,如果沒有傳遞,則將其設置爲null。

+0

你應該發佈'Intent'創建代碼並且你的活動的'onCreate'。 – 2012-03-07 15:45:25

回答

6

實際上文檔說,如果映射沒有發現「01」返回。 http://developer.android.com/reference/android/os/Bundle.html#getLong(java.lang.String)

(同樣,「long」類型是一個原語,不能爲空)。

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

中,你可以定義默認值來接收何時關鍵是沒有找到(例如-1)。

+0

它實際上使用Long類型,是一個包裝原始對象的很長時間。 – 2012-03-07 15:48:25

+0

你從哪裏看到的? getLong()的方法簽名表示它返回一個'long'類型,而不是'Long'。但是我沒有看到Android源代碼,所以也許在幕後它實際上使用了一個Long。無論如何,它返回0而不是null的事實是文檔中所說的。 – YuviDroid 2012-03-07 15:52:05

+0

我從幾本書中讀到這種方法,這些書從ListView中選擇一個項目後指向填充字段。它誠實地工作,在另一個答案我只是解釋了爲什麼我認爲它的工作。看起來,如果任何額外的意圖傳遞,它確實返回0而不是null。只要我刪除了putExtra(),它就像預期的那樣返回null。只需要弄清楚如何傳遞我需要的兩個參數。 – 2012-03-07 15:58:43

0

該包與意圖不一樣。你必須使用getIntent()。getExtras()。getLong()。 (假設你搞亂了和正在使用的savedinstance)

+0

哎呀,沒有正確閱讀您的文章的最後部分。把日誌放在正確的位置,這也可能是一個問題,取決於該活動是否已經存在於後臺堆棧中 - 它可能會使用舊的意圖? – jsimpson 2012-03-07 15:45:37

+0

看來,當任何額外的意圖傳遞時,無論密鑰字符串是什麼,它都會導致getLong返回0而不是null。我傳遞了一個不同的意圖,稱爲「_stateId」。我認爲它不同於我正在搜索的「_id」字符串意味着它將返回null。但是我只是刪除了其他putExtra行,現在它工作正常。 – 2012-03-07 15:54:53

2

這裏的問題是,如果沒有找到映射,它應該返回0。函數getLong()返回一個長原語,它永遠不能爲空。如果將它映射到一個Long對象,它將仍然具有零值,因爲您只是將它傳遞給一個0值。 Java足夠聰明,可以將原始值分配給相應的盒子對象。例如:

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

你有2個解決方案:

1)如果您確實需要有一個空值,你可以擴展它擴展了Parcelable接口你自己的龍包裝類。然後,當你可以調用Bundle.getParcelable(「key」)時,如果該鍵不存在,你將得到一個空值。

2)使用函數getLong(String key,long defaultValue)。將默認值設置爲某個永遠不會在您的應用中使用的常數。然後,如果函數返回此值,則知道該鍵不存在。這隻有在可以保證永遠不會成爲有效數據的長期值的情況下才有可能。

+0

感謝您的幫助,使用默認值工作的getLong方法。 – 2012-03-07 16:35:52

相關問題