方法ViewGroup.addView
的第二個參數是ViewGroup.LayoutParams
。在許多情況下,你想使用一個子類,如RelativeLayout.LayoutParams
,但令人討厭的是在方法簽名中沒有類型安全性,所以下面的所有代碼都可以編譯並顯然工作。使用ViewGroup.LayoutParams時的類型安全性
relativeLayout.addView(textView, new ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
relativeLayout.addView(textView, new RelativeLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
relativeLayout.addView(textView, new FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
這讓我很擔心,因爲它會非常容易意外地提供錯誤的類型。 (我不明白爲什麼它是這樣設計的,但這不是我的問題)。
顯然,當ViewGroup
佈局時,爲了讀取任何額外的規則,所有孩子的LayoutParams
必須在某個時刻轉換爲適當的類型。我可以確定對於ViewGroup
的所有標準子類,所有這些類型都是檢查類型(即跟在instanceof
之後),所以如果提供的類型錯誤,我在運行時永遠不會得到ClassCastException
?
我的問題不是「是否在子類中檢查addView()是否檢查正確的類型?」,但「類型是否在ViewGroup被佈置時被檢查?」。不過你也回答了這個問題。這非常煩人 - 我相信這可能是更好的設計,以便這些錯誤甚至不會編譯。 –
@PaulBoddington:「當ViewGroup佈局後,類型會被檢查嗎?」 - 沒有。偶爾,一個擰緊的結果仍然存在,因爲佈局傳遞只需要超類的東西(例如'MarginLayoutParams')。但是,通常情況下,你會爆炸。 「我相信這可能是設計得更好,因此這些錯誤甚至不會編譯」 - 同意。在他們的防守中,相對較少的人自己推出這些東西,而寧願增加布局資源,然後這變得更不是問題。 – CommonsWare