android - RelativeLayout 上面的 LayoutParams

标签 android android-relativelayout layoutparams

我有两个 View ,比方说 A 和 B。我希望 A 垂直放置在 B 上方,但与 B 水平居中对齐,即我想实现这一点:

enter image description here

我试过:

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))leftright 属性设置为它们需要的值,以便居中在 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/

相关文章:

java - 我将一轮高尔夫球的每洞得分存储在数据库中。我想编写一个函数,对表中的该列求和并显示在 toast 中

android - 如何对齐中心大圆周围的 8 个小圆圈,如附图所示?

android - 在 Android 1.5 上查看与 RelativeLayout 的重叠

android - 在线程内添加和清除窗口标志

java - 无法通过 KSOAP Android 登录到 Web 服务

android - 将 boofcv-core 添加到 Android : java. lang.RuntimeException : Duplicate class com. google.protobuf 后出错

java - 如何以编程方式使用 'dp' 设置边距?

java - 如何在 TabWidget 上方添加 ActionBar?

android - 使用 getLayoutParams() 时出现空指针异常

android - Seekbar 未设置 .getLayoutParams().height