gpt4 book ai didi

android - MATCH_PARENT 如果兄弟 View 较大,WRAP_CONTENT 如果兄弟 View 较小

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:43:53 27 4
gpt4 key购买 nike

我在一个布局中有两个 View 。我将分别称它们为 View AView B

┌──────┐
│┌─┐┌─┐│
││A││B││
│└─┘└─┘│
└──────┘

父布局(包括View AView B)的高度是WRAP_CONTENT

这里,View B 的高度是WRAP_CONTENT。也就是说,它的高度可以根据其内容进行更改。

我想做的是

  1. 如果 View A 的内容比 View B 短,则将 View A 的高度设置为 View B 的高度的内容。
  2. 如果 View A 的内容高于 View B 的内容,则将 View A 的高度设置为其内容的高度。

所以,

① 如果 View B 的内容较高,则 View A 的高度设置为 View B 的高度。

       ┌──────┐      ┌──────┐
│┌─┐┌─┐│ │┌─┐┌─┐│
││ ││ ││ ││A││ ││
I want ││A││B││, not │└─┘│B││.
││ ││ ││ │ │ ││
│└─┘└─┘│ │ └─┘│
└──────┘ └──────┘

② 如果View B的内容较短,则View A的高度为View A自身内容的高度。

       ┌──────┐      ┌──────┐
│┌─┐┌─┐│ │┌─┐┌─┐│
││ ││B││ ││A││B││
I want ││A│└─┘│, not │└─┘└─┘│.
││ │ │ └──────┘
│└─┘ │
└──────┘

如果父级是 LinearLayout (Horizo​​ntal),将 View A 的高度设置为 WRAP_CONTENT 违反情况 1,并且设置 查看 AMATCH_PARENT 的高度违反了情况 2。

如果父级是 RelativeLayout,设置 View A 使其父级的顶部和底部对齐违反了 RelativeLayout 的条件:
请注意,您不能在 RelativeLayout 的大小与其子项的位置之间存在循环依赖关系。例如,您不能将 RelativeLayout 的高度设置为 WRAP_CONTENT,并将子项设置为 ALIGN_PARENT_BOTTOM。

我该如何解决这个问题?

最佳答案

有不同的方法来解决这个问题,例如通过创建您自己的自定义 ViewGroup,可能基于水平 LinearLayout。但是,我认为最直接的解决方案是在运行时动态设置需求。

考虑以下布局,在水平 LinearLayout 中只有两个 TextView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#f00"
android:padding="10dp" >

<TextView
android:id="@+id/first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#0f0"
android:padding="5dp"
android:text="One line" />

<TextView
android:id="@+id/second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00f"
android:padding="5dp"
android:text="Two\nlines"
android:textColor="#fff" />

</LinearLayout>

两者都包裹了他们的高度,这基本上符合你的第一个要求。

现在要求 2:出于演示目的,我将第二个 TextView 的文本分成两行,以使其比第一个更高。要使第一个 TextView 匹配它的高度,您需要做的就是:

LinearLayout container = (LinearLayout) findViewById(R.id.container);
final TextView first = (TextView) findViewById(R.id.first);
final TextView second = (TextView) findViewById(R.id.second);

container.post(new Runnable() {
@Override public void run() {
int h1 = first.getMeasuredHeight();
int h2 = second.getMeasuredHeight();
if (h1 < h2) first.getLayoutParams().height = h2;

}
});

“技巧”是发布到 View 的队列,确保逻辑不会在子项被测量并具有有效高度之前执行。对于要求 2,只有在第二个 View 更高时才需要更改第一个 View 的高度,这正是 run() 方法中的部分所做的。

关于android - MATCH_PARENT 如果兄弟 View 较大,WRAP_CONTENT 如果兄弟 View 较小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17119173/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com