如何将视图(如RelativeLayout)与侄子视图对齐?

时间:2016-05-13 14:34:54

标签: android relativelayout

Related question。答:RelativeLayout无法做到。无论如何我都在问这个问题,不是只是 RL,或者是其他东西。

一般故事:你有一个难以调整的复杂布局,随之而来的是要求添加某些内容,与嵌套视图对齐。
enter image description here

最好的方法是什么?一个自定义样式的弹出窗口? (还不熟悉那些)?花费几天时间将整个层次结构更改为单个RelativeLayout?自定义Layout类作为包装器?
以编程方式更改AbsoluteLayout或边距的LayoutParams(已弃用)或FrameLayout? (我宁愿避免,我不想触及测量等)

简化示例(与上述图片无关):
LinearLayout定义元素的相对高度。我不知道用RelativeLayout来做这件事 anExpandableView是从someBar下滑动的动画(此处为全宽,但可能需要对齐其宽度以及垂直位置)。

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:animateLayoutChanges="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <include
            android:id="@+id/topStuff"
            layout="@layout/incl_topstuff"
            android:layout_width="match_parent"
            android:layout_weight="7"
            android:layout_height="0dip" />

        <include
            android:id="@+id/someBar"
            layout="@layout/incl_filters_and_stuff"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <include
            android:id="@+id/bottomStuff"
            layout="@layout/incl_bottomstuff"
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="10" />

    </LinearLayout>

    <include
        android:id="@+id/anExpandableView"
        layout="@layout/incl_filters"
        android:visibility="gone"
        android:layout_below="@id/someBar"/>

</RelativeLayout>

我知道SO对一般性问题有厌恶,但我不想要一个临时解决方案。我想知道如果只有一个包裹RelativeLayout允许对齐一个不是直接兄弟的视图的情况下会解决的情况。

1 个答案:

答案 0 :(得分:1)

简单地说,RelativeLayout只能相互测量和布置它的直接孩子,但我想你已经知道了。

唯一的通用解决方案是实现自己的自定义Layout类,我不建议这样做。如果我不得不猜测为什么RelativeLayout不会在它的级别及以下遍历整个布局层次结构,那么可能是出于性能原因。

不幸的是,如果您使用的是RelativeLayouts和LinearLayouts,并且您希望视图彼此依赖,则必须选择一种方法并坚持使用它,可以是RelativeLayout的平面层次结构,也可以是LinearLayout的嵌套层次结构。

根据您的示例,据我所知,无法使用RelativeLayout实现加权视图,因此您无法使用LinearLayout。

最简单的方法是在代码中膨胀expandableView,将其与RelativeLayout的底部对齐,根据bottomStuff设置它的高度和位置,并从那里设置动画。

如果你真的想在xml中做到这一点,我可以想到一个有点hacky,ad-hoc方法,但可以推广到镜像任何层次结构的测量和布局,只需要一些工作。

创建一个并行但不可见的LinearLayout,它是第一个兄弟的兄弟。给它一个空的视图,顶部是重量7,中间是someBar的一个看不见的副本,然后是重量为10的可扩展视图。要让它向上滑动,要么为不可见的someBar的高度和空的重量设置动画。查看顶部朝向0,或删除它们/将它们设置为已消失并在LinearLayout上设置animateLayoutChanges。