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

时间:2012-01-20 13:52:54

标签: java android

如果我宣布LinearLayout linearLayout并查看linearLayout.getLayoutParams(),则会向我ViewGroup.LayoutParams,而不是LinearLayout.LayoutParams

所以我必须使用重复(因此很糟糕)的结构:

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

我是否真的必须使用它,例如,如果我想达到边距?

是我对Android或Java,或两者或其他什么的误解?

5 个答案:

答案 0 :(得分:22)

我认为您对' LayoutParams'是不正确的。视图(或布局)LayoutParams必须是父视图的LayoutParams'的实例。

例如,这里是RelativeLayout中的LinearLayout。 LinearLayout的LayoutParams必须是RelativeLayout.LayoutParams。这件事使我们能够正确设置属性,例如' centerInParent'等等。

当您调用getLayoutParams()时,它将返回与父ViewGroup类型匹配的各种LayoutParams实例。因此,我们需要在调用getLayoutParams()时重复投射视图的LayoutParams类型。

答案 1 :(得分:7)


只是以非常直接的方式表达:

请记住,当您获得视图的LayoutParams时,它们的类由此视图的父视图的类决定

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

您必须转换视图的LayoutParams,因为您事先无法知道父类的内容。因此,如果 view 的父级是LinearLayout,那么它的 LayoutParams 将是 LinearLayout.LayoutParams 类型,仍然需要强制转换它到这种类型!


我不确定源代码及其如何发展。但它是非常合乎逻辑的,因为RelativeLayout.LayoutParams,例如具有在LinearLayout.LayoutParams中找不到的ABOVE和BELOW等属性。而这些参数实际上取决于父母。

答案 2 :(得分:2)

您不会将LinearLayout.LayoutParams强制转换为LinearLayout.LayoutParams。这是没有意义的。此外,还不清楚代码中的linearLayout是否是实例变量......无论哪种方式,您都可以简单地引用View中的LayoutParams,它从某种类型的View扩展到View的LayoutParams。例如,如果你在一个从RelativeLayout扩展的类中,那么

LayoutParams params = new LayoutParams(200, LayoutParams.WRAP_CONTENT);

获取RelativeLayout.LayoutParams。否则,您需要获得您正在寻找的LayoutParams资格。要获取/应用LinearLayout LayoutParams,您只需要

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams();

修改

linearLayout.getLayoutParams()会返回您拨打layoutParams时提供的setLayoutParams,因此请先确保您这样做。然后,一旦完成,您只需要将返回的LayoutParams转换为您设置的LayoutParams。所以

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) linearLayout.getLayoutParams() 

另外,为什么你需要这样的参数?你最终想要完成什么?我问,因为可能有一种更简单的方法来做你想要做的事情......

实际上,您的问题的答案是肯定的,您需要转换从getLayoutParams获得的LayoutParams,因为这是从View类派生的方法,它返回LayoutParams的超类,它是ViewGroup.LayoutParams,由于多态性,可以转换为你知道的类型。

答案 3 :(得分:1)

您是否正在使用Eclipse并使用Eclipse的“组织导入”选项来导入Android库?如果是这样,有几个不同的库名为LayourParams,Eclipse似乎是导入framelayout一个而不是你需要的linearlayout。

所以只需更改班级顶部的导入。

答案 4 :(得分:0)

您不需要从LinearLayout本身获取LinearLayout Params对象。你可以自己创建一个新的。

// Set up the height and width of the layout, you can set FILL_PARENT 
// or even WRAP_CONTENT
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width, height);
// Set up your margins
lp.setMargins(left, top, right, bottom);

现在在LinearLayout对象实例上使用此lp对象

linearLayout.setLayoutParams(lp);