Related question。答:RelativeLayout无法做到。无论如何我都在问这个问题,不是只是 RL,或者是其他东西。
一般故事:你有一个难以调整的复杂布局,随之而来的是要求添加某些内容,与嵌套视图对齐。
最好的方法是什么?一个自定义样式的弹出窗口? (还不熟悉那些)?花费几天时间将整个层次结构更改为单个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
允许对齐一个不是直接兄弟的视图的情况下会解决的情况。
答案 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。