10

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

另一种说法是,A 应始终获得至少 50% 的可用高度,而 B 应获得最多 50%。

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

我能看到的唯一方法是使用 A 或 B 的自定义类并覆盖 onMeasure 以将高度限制为父级的 50%,但似乎应该有更简单的方法。

4

4 回答 4

3

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

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

在此处输入图像描述

于 2012-10-18T06:47:12.687 回答
0

您必须编写自己的组件来实现这一点。

例如,如果您在此处使用 LinearLayout,则可以使用过度的 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 源代码 (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/) 中复制原始的 onMeasure 方法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.htmlhttp://developer.android.com/reference/android/view/View.html#onMeasure (整数,整数)。

于 2012-10-18T15:35:37.903 回答
0

现在可以使用 ConstraintLayout 达到预期的效果:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/containerFrameLayout"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <android.support.constraint.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.5"/>

    <FrameLayout
        android:id="@+id/containerFrameLayout"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constrainedHeight="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline"
        app:layout_constraintVertical_bias="1">

        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </FrameLayout>
</android.support.constraint.ConstraintLayout>
于 2019-03-21T18:07:20.163 回答
-1

创建一个带有两个内部框架的线性布局,每个框架都有权.5重。这些框架内,放置您的视图,将它们设置为wrap_contentmatch_parent视情况而定。

于 2012-10-18T01:47:33.743 回答