我在一个布局中有两个 View 。
我将分别称它们为 View A
和 View B
。
┌──────┐
│┌─┐┌─┐│
││A││B││
│└─┘└─┘│
└──────┘
父布局(包括View A
和View B
)的高度是WRAP_CONTENT
。
这里,View B
的高度是WRAP_CONTENT
。也就是说,它的高度可以根据其内容进行更改。
我想做的是
- 如果
View A
的内容比View B 短,则将
的内容。View A
的高度设置为View B
的高度 - 如果
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 (Horizontal)
,将 View A
的高度设置为 WRAP_CONTENT
违反情况 1,并且设置 查看 A
到 MATCH_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/