wrap_content高度,但仅限于父级的一半

我想要的是有垂直排列的2个视图的布局。 我们称之为顶视图A和底视图B.我希望给B的高度是它的正常高度(即包装内容),除了我不希望它被给予超过一半的可用空间。 A得到剩下的东西

另一种说法是A应该至less有50%的可用高度,B应该至less有50%。

我似乎无法find一个简单的方法来实现这一目标。 我可以将两个布局高度设置为0,并赋予它们相同的权重,这使得它们总是50%,但是如果B小于50%,它应该只给出它所需要的。

唯一的办法,我可以看到这样做是使用A或B的自定义类,并重写onMeasure约束的高度为家长的50%,但似乎应该有一个更简单的方法。

Solutions Collecting From Web of "wrap_content高度,但仅限于父级的一半"

好的,我现在明白了。 如果我理解正确,你想要这样:

if A > B -> do nothing if B > A & B > parent layout -> 50% to both of them if B > A & B < parent layout -> A = parent layout - B 

我不得不在onWindowFocusChanged做这一切,否则在onCreate视图的高度将返回0.我做了2个LinearLayouts作为子布局,但你可以采取任何你想要的。

我的XML:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:id="@+id/parent_lay" android:orientation="vertical" android:layout_height="match_parent" > //Layout A: <LinearLayout android:id="@+id/lay_1" android:layout_width="match_parent" android:background="@android:color/background_dark" android:layout_height="10dp" > </LinearLayout> //Layout B: <LinearLayout android:id="@+id/lay_2" android:layout_width="match_parent" android:layout_height="40dp" android:background="#123456" > </LinearLayout> </LinearLayout> 

主要活动:

 public class MainActivity extends Activity { LinearLayout parent_lay; LinearLayout lay_1; LinearLayout lay_2; int parent_height; int lay_1_height; int lay_2_heigth; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override public void onWindowFocusChanged(boolean hasFocus) { // TODO Auto-generated method stub super.onWindowFocusChanged(hasFocus); parent_lay = (LinearLayout) findViewById(R.id.parent_lay); lay_1 = (LinearLayout) findViewById(R.id.lay_1); lay_2 = (LinearLayout) findViewById(R.id.lay_2); lay_1_height = lay_1.getHeight(); lay_2_heigth = lay_2.getHeight(); parent_height = parent_lay.getHeight(); if (lay_2.getHeight() > lay_1.getHeight() && lay_2.getHeight() > (parent_lay.getHeight() / 2)) { lay_1.setLayoutParams(new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, 0, 1)); lay_2.setLayoutParams(new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, 0, 1)); } else if (lay_2.getHeight() < (parent_lay.getHeight() / 2)) { lay_1.setLayoutParams(new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, (parent_height - lay_2_heigth))); } } } 

例如:如果A是60dp ,B是40dp

在这里输入图像说明

如果A是60dp ,B是400dp

在这里输入图像说明

你必须编写你自己的组件来达到这个目的。

例如,如果您在这里使用LinearLayout,则可以使用overMeasure onMeasure方法扩展LinearLayout。 你可以像这样实现onMeasure:

 @Override protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int width = getMeasuredWidth(); final int height = getMeasuredHeight(); setMeasuredDimension(width, height / 2); } 

这个代码不够优雅。 如果你真的想做得很好,请从Android源代码中复制原始的onMeasure方法(http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/ android / widget / LinearLayout.java#LinearLayout.onMeasure%28int%2Cint%29)和measureVertical(int widthMeasureSpec, int heightMeasureSpec) ,设置mTotalLength = mTotalLength / 2

有关onMeasure的详细信息,请访问http://developer.android.com/guide/topics/ui/custom-components.html和http://developer.android.com/reference/android/view/View.html#onMeasure (int ,int)。

用两个内部框架创build线性布局,每个框架的重量为.5这些框架中,放置您的视图,根据需要将它们设置为wrap_contentmatch_parent