2015-09-06 68 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