我有两个 View ,比方说 A 和 B。我希望 A 垂直放置在 B 上方,但与 B 水平居中对齐,即我想实现这一点:
我试过:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)
viewA.getLayoutParams();
layoutParams.addRule(
RelativeLayout.ABOVE,
viewB.getId()
);
但显然它所做的是将 A 垂直放置在 B 上方,但水平 float 到左侧(与 X 的左侧对齐)
请帮忙。
最佳答案
你所拥有的是在正确的路径上,但你还需要为水平居中添加一个规则:layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
我认识到这并不完全符合您的要求,因为它指定您在父 View 中水平居中,而不是指定您对齐 A 和 B 的水平中心,但没有直接的使用 RelativeLayout 规则执行后者的方法。 (有许多间接方法可以代替。)
添加:
鉴于您的 View A
没有在父 View 中水平居中,这里有一个建议。我不知道执行此操作的好方法/非 hacky 方法,但我认为由于在测量过程中应用了 RelativeLayout 规则,因此您可以使用 View A
的左(和右)坐标> 完成测量后,将 View B
的(公共(public))left
和 right
属性设置为它们需要的值,以便居中在 A
下查看。
例如,如果您的父 View 是 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()
和回调来实现相同的目的。
关于android - RelativeLayout 上面的 LayoutParams,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20337316/