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

标签 android android-layout

我在一个布局中有两个 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/

相关文章:

android - setMinimumWidth() 在 android View 中使用什么测量单位?

android - Recyclerview水平滚动,如何像寻呼机一样滚动显示一个项目

Android使用base64上传图片到服务器

Android Studio 错误 : 'command ' C:\Program Files\Java\jdk1. 7.0_75\bin\java.exe'' 已完成,退出值非零 2

android - 从 Android 中的 EditText 中移除焦点

android - ClassCastException android.view.viewgroup.$layoutParams

android - 使用 ConstraintLayout 以编程方式连接设置为任意大小的多个 View

Android Button 的背景为带阴影的形状

java - 浅谈Android平台上的多线程

android - 在中文 ROM 中运行前台服务