我有两个视图,比如A和B.我希望A垂直放在B上方,但是与B中心对齐,即我希望实现这一点:
我试过了:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)
viewA.getLayoutParams();
layoutParams.addRule(
RelativeLayout.ABOVE,
viewB.getId()
);
但显然它的作用是将A垂直放置在B上方,但水平浮动到左侧(与X的左侧对齐)
请帮忙。
答案 0 :(得分:1)
您拥有的是正确的路径,但您还需要为水平居中添加规则:layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
我认识到这并没有完全按照你的要求进行,因为它指定你水平居中在父视图中,而不是指定你对齐A和B的水平中心,但没有直接使用RelativeLayout规则来执行后者的方法。 (有许多间接方法可以代替。)
<强>增加:强>
鉴于您的视图A
未在父级中水平居中,这是一个建议。我不知道这样做的好/非hacky方法,但我认为由于在测量过程中应用了RelativeLayout规则,因此您可以在测量后使用视图A
的左(和右)坐标用于将视图left
的(公共)right
和B
属性设置为他们需要的内容,以便将视图置于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()
来实现同样的目的。