如何将视图(如 RelativeLayout 中的视图)与侄子视图对齐?
How to align view (like in RelativeLayout) with a nephew view?
Related question。答:RelativeLayout做不到。我想问的是如何做到这一点,而不是 只是 RL,或者其他东西。
一般情况:您有一个难以调整的复杂布局,随之而来的是添加内容的请求,与嵌套视图对齐。
最好的方法是什么?具有自定义样式的弹出窗口? (还不熟悉那些)?花几天时间将整个层次结构更改为单个 RelativeLayout
?自定义布局 class 作为包装器?
AbsoluteLayout
(已弃用)或以编程方式更改 LayoutParams
或边距的 FrameLayout? (这个我宁愿避免,我宁愿不碰 onMeasure 等)
简化示例(与上图无关):
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
允许与不是直接兄弟的视图对齐就可以解决的情况该怎么办。
简单来说,RelativeLayout 只能根据彼此测量和布局它的直接子级,但我想你已经知道了。
唯一的通用解决方案是实现您自己的自定义布局 class,我不推荐这样做。如果我不得不猜测为什么 RelativeLayout 不遍历其级别及以下的整个布局层次结构,那可能是出于性能原因。
不幸的是,如果您正在使用 RelativeLayouts 和 LinearLayouts 并且您希望视图相互依赖,您必须选择一种方法并坚持使用它,RelativeLayout 的平面层次结构或 LinearLayout 的嵌套层次结构。
根据您的示例,据我所知,无法使用 RelativeLayout 实现加权视图,因此您只能使用 LinearLayout。
做你想做的最简单的方法是在代码中膨胀你的 expandableView,将它与 RelativeLayout 的底部对齐,根据 bottomStuff 设置它的高度和位置,并从那里开始动画。
如果你真的想在 xml 中做到这一点,我可以想到一种有点笨拙的临时方法,但可以推广到镜像任何层次结构的测量和布局,只需一点工作。
创建一个平行但不可见的 LinearLayout,它是第一个的兄弟。给它一个顶部权重为 7 的空视图,中间是 someBar 的一个不可见副本,然后是权重为 10 的可扩展视图。要让它向上滑动,要么设置不可见 someBar 的高度和空的权重的动画在顶部查看 0,或删除 them/set 它们消失并在 LinearLayout 上设置 animateLayoutChanges。
Related question。答:RelativeLayout做不到。我想问的是如何做到这一点,而不是 只是 RL,或者其他东西。
一般情况:您有一个难以调整的复杂布局,随之而来的是添加内容的请求,与嵌套视图对齐。
最好的方法是什么?具有自定义样式的弹出窗口? (还不熟悉那些)?花几天时间将整个层次结构更改为单个 RelativeLayout
?自定义布局 class 作为包装器?
AbsoluteLayout
(已弃用)或以编程方式更改 LayoutParams
或边距的 FrameLayout? (这个我宁愿避免,我宁愿不碰 onMeasure 等)
简化示例(与上图无关):
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
允许与不是直接兄弟的视图对齐就可以解决的情况该怎么办。
简单来说,RelativeLayout 只能根据彼此测量和布局它的直接子级,但我想你已经知道了。
唯一的通用解决方案是实现您自己的自定义布局 class,我不推荐这样做。如果我不得不猜测为什么 RelativeLayout 不遍历其级别及以下的整个布局层次结构,那可能是出于性能原因。
不幸的是,如果您正在使用 RelativeLayouts 和 LinearLayouts 并且您希望视图相互依赖,您必须选择一种方法并坚持使用它,RelativeLayout 的平面层次结构或 LinearLayout 的嵌套层次结构。
根据您的示例,据我所知,无法使用 RelativeLayout 实现加权视图,因此您只能使用 LinearLayout。
做你想做的最简单的方法是在代码中膨胀你的 expandableView,将它与 RelativeLayout 的底部对齐,根据 bottomStuff 设置它的高度和位置,并从那里开始动画。
如果你真的想在 xml 中做到这一点,我可以想到一种有点笨拙的临时方法,但可以推广到镜像任何层次结构的测量和布局,只需一点工作。
创建一个平行但不可见的 LinearLayout,它是第一个的兄弟。给它一个顶部权重为 7 的空视图,中间是 someBar 的一个不可见副本,然后是权重为 10 的可扩展视图。要让它向上滑动,要么设置不可见 someBar 的高度和空的权重的动画在顶部查看 0,或删除 them/set 它们消失并在 LinearLayout 上设置 animateLayoutChanges。