如何使API18-19的layout_weight与其他API级别相同?

时间:2017-01-23 17:31:09

标签: android layout android-layout-weight

以下是我想要获得的结果,而我正在使用 API< = 17 API> = 20 Correct result on API25

但是对于 API 18-19 ,FrameViews的高度并不尊重layout_weight值:

enter image description here

问题可能与以下事实有关:要使panelLayout身高match_parent,我需要添加layout_alignParentTop="true"layout_alignParentBottom="true"

这是完整的布局代码:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/wrappingScrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:fillViewport="true"
    >

    <RelativeLayout
        android:id="@+id/content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/holo_green_light"
        >

        <View
            android:id="@+id/longView"
            android:layout_width="150dp"
            android:layout_height="600dp"
            android:layout_margin="10dp"
            android:background="@android:color/holo_red_light"
            />

        <LinearLayout
            android:id="@+id/panelLayout"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_alignBottom="@id/longView"
            android:layout_alignLeft="@id/longView"
            android:layout_alignTop="@id/longView"
            android:layout_margin="10dp"
            android:background="@android:color/holo_blue_bright"
            android:orientation="vertical"
            >

            <FrameLayout
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:layout_margin="10dp"
                android:layout_weight="1"
                android:background="@android:color/holo_purple"
                android:padding="5dp"
                >

                <View
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:layout_gravity="center"
                    android:background="@android:color/black"
                    />
            </FrameLayout>

            <FrameLayout
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:layout_margin="10dp"
                android:layout_weight="1"
                android:background="@android:color/holo_purple"
                android:padding="5dp"
                >

                <View
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:layout_gravity="center"
                    android:background="@android:color/black"
                    />
            </FrameLayout>
        </LinearLayout>
    </RelativeLayout>
</ScrollView>

您不知道如何让Android在17级以上的每个API级别上设置相同的视图?考虑longView动态的大小。

2 个答案:

答案 0 :(得分:1)

FrameLayout更改为RelativeLayout,其颜色为紫色,根RelativeLayout的高度属性应为match_parent

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/wrappingScrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:fillViewport="true">

<RelativeLayout
    android:id="@+id/content"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:background="@android:color/holo_green_light">

    <View
        android:id="@+id/longView"
        android:layout_width="50dp"
        android:layout_height="600dp"/>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="600dp"
        android:layout_margin="10dp">

    <LinearLayout
        android:id="@+id/panelLayout"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        android:background="@android:color/holo_blue_bright"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_margin="10dp"
            android:layout_weight="1"
            android:background="@android:color/holo_purple"
            android:padding="5dp">

            <View
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:layout_centerInParent="true"
                android:background="@android:color/black" />
        </RelativeLayout>

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_margin="10dp"
            android:layout_weight="1"
            android:background="@android:color/holo_purple"
            android:padding="5dp">

            <View
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:layout_centerInParent="true"
                android:background="@android:color/black" />
        </RelativeLayout>
    </LinearLayout>
</RelativeLayout>
</RelativeLayout>

</ScrollView>

答案 1 :(得分:0)

除了公认的解决方案,以下是如何以编程方式解决布局错误:

        panelLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(final View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                if (bottom != oldBottom) {
                    v.post(new Runnable() {
                        @Override
                        public void run() {
                            v.getLayoutParams().height = mButtonsStripLeft.getHeight();
                            v.requestLayout();
                        }
                    });
                }
            }
        });

它允许动态更改longView的高度,仍然可以使解决方法正常工作。

animateLayoutChanges="true"设置panelLayout后,我无法使其正常工作。所以必须禁用它。