如果兄弟视图较大,则为MATCH_PARENT;如果兄弟视图较小,则为WRAP_CONTENT

我在布局中有两个视图。 我会分别称他们为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 (Horizontal)WRAP_CONTENT View A的高度设置为WRAP_CONTENT违反第一种情况,将View A的高度设置为MATCH_PARENT违反MATCH_PARENT情况。

如果父类是RelativeLayout ,那么设置View A来alignment其父母的顶部和底部都违反了RelativeLayout的条件: Note that you cannot have a circular dependency between the size of the RelativeLayout and the position of its children. For example, you cannot have a RelativeLayout whose height is set to WRAP_CONTENT and a child set to ALIGN_PARENT_BOTTOM. Note that you cannot have a circular dependency between the size of the RelativeLayout and the position of its children. For example, you cannot have a RelativeLayout whose height is set to WRAP_CONTENT and a child set to ALIGN_PARENT_BOTTOM.

我怎么解决这个问题?

Solutions Collecting From Web of "如果兄弟视图较大,则为MATCH_PARENT;如果兄弟视图较小,则为WRAP_CONTENT"

有不同的方法可以做到这一点,例如通过创build自己的自定义ViewGroup ,可能基于水平LinearLayout 。 但是,我认为最直接的解决scheme是在运行时dynamic设置需求。

考虑在水平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; } }); 

“技巧”是发布到视图的队列中,确保逻辑不会被执行,直到孩子被测量并具有有效的高度。 对于需求2,如果第二个视图更高,则第一个视图的高度只需要改变,这正是run()方法中的部分。

您需要使用布局参数以编程方式设置视图的维度。 假设你正在使用LinearLayout来保存视图,这是你将要做的事情:

 //the views are called a and b LinearLayout.LayoutParams aParams = a.getLayoutParams(); LinearLayout.LayoutParams bParams = b.getLayoutParams(); int aWidth = aParams.width; int aHeight = aParams.height; int bWidth = bParams.width; int bHeight = bParams.height; if (aHeight >= bHeight) { // do nothing } else { a.setLayoutParams(new LinearLayout.LayoutParams(aWidth, bHeight)); } 

当你设置它们的高度时,最初把它们作为wrap_content保存在xml中,在这个修改之前。

这可以很容易地解决,从axml。

保持父布局的高度为wrap_content,并将每个子视图的高度设置为match_parent。 这将导致父布局的高度包装到最高的孩子,每个孩子的视图的高度伸展到父母。

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="text" /> <TextView android:layout_width="wrap_content" android:layout_height="match_parent" android:text="More\ntext" /> </LinearLayout>