【问题标题】:RelativeLayout LayoutParam Above上面的RelativeLayout LayoutParams
【发布时间】:2013-12-03 10:44:59
【问题描述】:

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

我试过了:

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

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

请帮忙。

【问题讨论】:

    标签: android android-relativelayout layoutparams


    【解决方案1】:

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

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


    补充:
    鉴于您的视图 A 未在父级中水平居中,这里有一个建议。我不知道这样做的好方法/非hacky方法,但我认为由于在测量过程中应用了RelativeLayout规则,因此您可以在测量完成后使用视图A的左(右)坐标将视图B 的(公共)leftright 属性设置为它们需要的属性,以便在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() 并使用回调来实现相同的目的。

    【讨论】:

    • 不幸的是 B 不一定在父母的中心。您建议的“间接方式”中最简单的一种方式是什么?
    • 对不起,我忘记了这个问题。我最终按照你说的做了,但由于其他原因,在 onMeasure 中做这件事不是一种选择。我最终在视图 B 上注册了 ViewTreeObserver.OnGlobalLayoutListener,并根据 B 的现有测量值重新定位 A。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2023-04-09
    • 1970-01-01
    • 2020-11-24
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多