2015-09-06 49 views
0

方法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

回答

0

我可以肯定地說所有的,所有這些鑄件進行檢查鑄件的ViewGroup的標準子類(即遵循一個instanceof),所以,如果我提供了錯誤的類型,我將永遠不會在運行時一個ClassCastException ?

我保證你不是這種情況,至少在某些情況下不是這樣。獲取ClassCastExceptions提供錯誤的LayoutParams類型絕對會發生,因爲在這種情況發生時,我不得不在Stack Overflow上回答大量問題。

這就是說,在大多數情況下,這個異常確實是編碼錯誤的指示(與用戶可能以某種方式觸發的東西相比)。

如果你的問題是「在ViewGroup檢查的正確類型的子類呢addView()?」,得到的回答通常是「不」,像RelativeLayout類不覆蓋addView(),但只是使用繼承的實現從ViewGroup

+0

我的問題不是「是否在子類中檢查addView()是否檢查正確的類型?」,但「類型是否在ViewGroup被佈置時被檢查?」。不過你也回答了這個問題。這非常煩人 - 我相信這可能是更好的設計,以便這些錯誤甚至不會編譯。 –

+1

@PaulBoddington:「當ViewGroup佈局後,類型會被檢查嗎?」 - 沒有。偶爾,一個擰緊的結果仍然存在,因爲佈局傳遞只需要超類的東西(例如'MarginLayoutParams')。但是,通常情況下,你會爆炸。 「我相信這可能是設計得更好,因此這些錯誤甚至不會編譯」 - 同意。在他們的防守中,相對較少的人自己推出這些東西,而寧願增加布局資源,然後這變得更不是問題。 – CommonsWare