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