RelativeLayout LayoutParams上面

时间:2013-12-02 20:36:11

标签: android relativelayout layoutparams

我有两个视图,比如A和B.我希望A垂直放在B上方,但是与B中心对齐,即我希望实现这一点:

enter image description here

我试过了:

RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)
    viewA.getLayoutParams();
layoutParams.addRule(
    RelativeLayout.ABOVE,
    viewB.getId()
);

但显然它的作用是将A垂直放置在B上方,但水平浮动到左侧(与X的左侧对齐)

请帮忙。

1 个答案:

答案 0 :(得分:1)

您拥有的是正确的路径,但您还需要为水平居中添加规则:layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);

我认识到这并没有完全按照你的要求进行,因为它指定你水平居中在父视图中,而不是指定你对齐A和B的水平中心,但没有直接使用RelativeLayout规则来执行后者的方法。 (有许多间接方法可以代替。)


<强>增加:
鉴于您的视图A未在父级中水平居中,这是一个建议。我不知道这样做的好/非hacky方法,但我认为由于在测量过程中应用了RelativeLayout规则,因此您可以在测量后使用视图A的左(和右)坐标用于将视图left的(公共)rightB属性设置为他们需要的内容,以便将视图置于A下。

例如,如果您的父视图是View的自定义扩展,您可以覆盖其onMeasure()方法,请调用:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);    // So that mA.left and mA.right first get set...
    mB.left = BWIDTH - (mA.left + mA.right) / 2;
    mB.right = mB.left + BWIDTH;
    /* You probably will need to re-measure (i.e., call super.onMeasure() again here)
     * if you need to get views X and Y to the left of view B or if  
     * if view B exceeds the previously-measured size... */
}

如果没有,你可以在父级和回调上使用setOnLayoutChangeListener()来实现同样的目的。