为什么 LinearLayout instance.getLayoutParams 看起来有一个错误的类?

2022-09-04 06:10:08

如果我声明并查看,它给了我,而不是。LinearLayout linearLayoutlinearLayout.getLayoutParams()ViewGroup.LayoutParamsLinearLayout.LayoutParams

因此,我必须使用重复(因此是糟糕的)样式构造:

int lm = ((LinearLayout.LayoutParams) linearLayout.getLayoutParams()).leftMargin?

例如,如果我想达到利润,我真的必须使用它吗?

是我对Android或Java的误解,还是两者兼而有之,还是别的什么?


答案 1

我认为你对“布局参数”的理解是不正确的。视图(或布局)必须是“父视图的布局参数”的实例。LayoutParams

例如,这是相对布局中的线性布局。LinearLayout 的 LayoutParams 必须是 RelativeLayout.LayoutParams。这个东西使我们能够正确设置属性,如“centerInParent”等。

调用 时,将返回与父视图组类型匹配的各种布局参数实例。因此,我们需要在调用 时重复转换视图的布局参数的类型。getLayoutParams()getLayoutParams()


答案 2

只是用一种非常直接的方式说:

请记住,当您获得视图的布局参数时,它们的类由此视图的父视图的类确定

这意味着一个非常重要的事实:

您必须强制转换视图的布局参数,因为您无法事先知道父级的类是什么。因此,如果视图的父级是线性布局,则它的布局参数的类型将是 LinearLayout.LayoutParams并且仍然必须将其转换为此类型!


我不确定源代码以及它是如何进行的。但是这是非常合乎逻辑的,因为例如相对布局.LayoutParams具有诸如ABOVE和LOWE之类的属性,这些属性在LinearLayout.LayoutParams中找不到。这些参数实际上依赖于父项。


推荐