2010-11-25 73 views
2

我剛剛冒險進入Android開發的有趣世界,但在我正在開發的測試應用程序中遇到了一個非常古怪的問題。如何避免android子組件中的重複ID?

該應用程序使用TableLayout,其中每個TableRow包含一個EditText和一些按鈕。

TableRows可以在運行時添加和刪除。這一切似乎工作正常,直到我意外地傾斜我的設備。顯示屏響應並重新排列了佈局,但突然,每行中的所有值都是相同的。

經過一番摸頭之後,我想清楚發生了什麼事。由於Android重新啓動活動導致方向發生變化。發生這種情況時,Android會嘗試保存並恢復您的實例狀態,但它通過存儲與組件ID相關的數據來實現此目的。

在我的情況下,因爲行都是從同一個佈局創建的,所以每行的EditText都有相同的ID。據我所知,結果是,當信息被保存時,每行都被覆蓋,以便最後一行勝出。

恢復時,只有一個值與該id相關聯,因此它會應用於每一行!

在我的情況下,我能夠解決這個問題,因爲我根本不需要保留這些值。在我的onSaveInstanceState中,我不會調用super.onSaveInstanceState,並且同樣在onRestoreInstanceState中。

這樣最終使我想起我的問題!

如果我想要保存和恢復這些單獨的行值,該怎麼辦?是否有一種可接受的方式來生成重用組件的獨特標識(在我的例子中是TableRow)?

+0

您是否找到了解決方案?我也有同樣的問題。 – 2013-10-06 01:05:37

+0

就像我說的,我實際上並不需要保留這些值,但根據您的目標API級別,您可以嘗試使用View.generateViewId()http://developer.android。com/reference/android/view/View.html#generateViewId%28 – xtempore 2013-10-06 08:07:56

回答

1

如果我是你,我就不會在一個EditText視圖中使用your_view.setId(your_new_id),因爲這使得你的應用程序不太穩定:如果其他視圖恰巧有相同的ID作爲your_new_id

我會使用your_ view.setTag(some_unique_tag),然後使用findViewWithTag(some_unique_tag)再次查找EditText視圖。

findViewWithTag(some_unique_tag)可能是任何Object - 我個人更喜歡String,因爲這樣很容易製作一些描述性和獨特的標籤。

請記住,它只是View s,您使用.setTag上有標籤。

1

除了setId,在View類中還有一個generateViewId方法。如果你想要17個版本,你可以從源文件中複製它。