如果我宣布LinearLayout linearLayout
并查看linearLayout.getLayoutParams()
,则会向我ViewGroup.LayoutParams
,而不是LinearLayout.LayoutParams
。
所以我必须使用重复(因此很糟糕)的结构:
int lm = ((LinearLayout.LayoutParams) linearLayout.getLayoutParams()).leftMargin?
我是否真的必须使用它,例如,如果我想达到边距?
是我对Android或Java,或两者或其他什么的误解?
答案 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);