2012-10-18 52 views
6

時相同的ID得到同樣的attrs我對此有兩個單選按鈕,IDS @+id/radioButton1@+id/radioButton2一個RadioGroup中的自定義組件。另一方面,有一個帶有五個選項卡的TabActivity。在每個選項卡上,此組件多次使用。瀏覽與恢復

這裏的問題,當方向的變化和活性重建,所有的單選按鈕被加載相同的attrs,這包括android:textandroid:margin甚至認爲我創建了風格ATTRS。它也發生在所有具有相同ID的CheckBox上。

我花了一些時間試圖發現爲什麼會發生這種情況,並得出結論,android正在onRestoreInstanceState中這樣做。如果我評論調用超級方法的行,它可以正常工作。

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    // super.onRestoreInstanceState(savedInstanceState); 

} 

這是它應該如何?或者有什麼可以導致這種情況?

我猜,這是因爲在創建自定義視圖時,膨脹與具有相同ID的相同意見相同的佈局不是一種正常的行爲。所以不可能每次都實例化一個新的自定義視圖來爲其子節點生成不同的ID。對清單使用上面的代碼或android:configChanges似乎對我來說是一個糟糕的解決方法。所以,任何幫助表示讚賞。

+0

我已經經歷了這一點。事實上,我已經花了幾天試圖跟蹤下來這個錯誤的。最糟糕的是,在我的情況下,這些觀點得到一個壞值並立即觸發視圖所代表的事物的狀態變化,這意味着我正在破壞狀態 我在一個SeekBar中看到了這種行爲,這個行爲嵌入了一個自定義視圖中,該視圖將SeekBar與其他我重複使用自定義視圖在Activity中的各個位置,當然能夠重用XML文件是首選。 –

回答

1

經過一段時間尋找解釋後,我終於在Android谷歌組中找到了來自Romain Guy的優秀作品,儘管它沒有提到自定義視圖。

「這是確定使用相同的ID時,你需要的意見,以保存其狀態時除外。id是 在保存自己的狀態,因此該工具包只是 認爲你的兩個觀點都是一樣的東西標識的看法。但是,這隻有 活動中真實的。「

」有使用兩個不同的活動相同的id沒有問題。而且 有使用,如果 你小心你的同一個活動中相同的ID沒有問題」重新做(例如,如果視圖 與共享ID不需要保存任何狀態。)在你的情況下, ,因爲活動s是一組選項卡的一部分,它們實際上是 綁定到一個獨特的上下文,這意味着您將遇到 共享ID的問題。 「

Here's the link

+1

與其僅僅鏈接到外部資源,你應該在其中包含一個(小)相關部分 - 鏈接本身可能會腐爛,並不是一個好的答案。 – slugster

1

您的savedInstanceState方法是什麼樣的?

我會建議分配給單選按鈕文本的變量不會在方向更改之間持續存在。請記住,活動在方向更改時完全重建/重新啓動。

+0

我不重寫onSaveInstanceState方法。我只重寫onRestoreInstanceState以防止android重新載入視圖,但使用相同的id與t他相同的AttributeSet。 –

+0

單選按鈕文本正在接收我的自定義視圖的最後一次出現的值,就像android正在清理將視圖狀態與其id相關聯的整個佈局(在savedInstanceState包中,我猜),然後爲所有視圖加載此狀態它關聯的ID。 –

+1

您是否曾嘗試通過創建佈局文件夾並將相同佈局xml文件複製到其中來創建替代橫向佈局文件? Android根據設備方向自動在兩者之間切換。這可能會迫使設備使用「新」信息重建視圖。 –