使用ViewGroup.LayoutParams时键入安全性

时间:2015-09-06 14:32:12

标签: android android-layout android-view

方法ViewGroup.addView的第二个参数是ViewGroup.LayoutParams。在许多情况下,您希望使用诸如RelativeLayout.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),因此如果我提供了错误的类型,我将永远不会得到{ {1}}在运行时?

1 个答案:

答案 0 :(得分:0)

  

我可以确定ViewGroup的所有标准子类都是所有这些强制类型转换(即跟随一个instanceof),这样如果我提供了错误的类型,我将永远不会在运行时获得ClassCastException吗?

我向你保证并非如此,至少在某些情况下并非如此。提示ClassCastExceptions提供错误的LayoutParams类型肯定会发生,因为当人们遇到这种情况时,我必须在Stack Overflow上回答相当多的问题。

话虽如此,在大多数情况下,此异常确实表明编码错误(与用户可能以某种方式触发的内容相比)。

如果您的问题是“对addView()的子类ViewGroup检查输入的类型是否合适?”,则答案通常为“否”,因为像RelativeLayout这样的类不会覆盖{ {1}}但只使用addView()中的继承实现。