Android布局在Marshmallow上呈现错误

时间:2016-01-07 15:04:35

标签: android android-layout android-6.0-marshmallow

我刚刚注意到,在Marshmallow上显示我的Android应用布局已损坏。在使用Android 5.1.1的Nexus 5上运行良好,但在使用最新版本的Android的Nexus 5和Nexus 5x上出现错误。

布局由与底部对齐的小三角形(见红色部分)组成,有一些视图(白色)应该跨越其父级的所有可用高度(灰色部分)。

这就是它在Android 5.1.1(Nexus 5)上呈现的方式:

nexus5_android5_fine

在Android 6.0(Nexus 5和Nexus 5X)上,它是:

nexus5x_android6_bad

问题看起来红色视图不尊重其父对齐方式(底部,右侧),并使白色视图(位于上方)消失。

灰色视图及其子视图的简化布局是(我添加了一些背景颜色以查看视图边界):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    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"    
    android:background="#777777">

    <View 
        android:id="@+id/preview_triangle"
        android:layout_width="@dimen/preview_triangle_width"
        android:layout_height="@dimen/preview_triangle_height"
        android:layout_marginRight="@dimen/preview_triangle_margin_right"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:background="#ff0000"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/preview_triangle"   
        android:orientation="horizontal">
        <View
            android:layout_width="@dimen/preview_margin_horizontal"
            android:layout_height="match_parent"/>
        <FrameLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:padding="3dp"
            android:background="@drawable/round_rectangle_white_radius_3dp">
            <WebView
                android:id="@+id/preview_webview"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
        </FrameLayout>

        <FrameLayout
            android:id="@+id/preview_close"
            android:layout_width="@dimen/preview_margin_horizontal"
            android:layout_height="@dimen/preview_margin_horizontal">
            <ImageView          
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="left|top"
                android:layout_marginLeft="@dimen/preview_close_margin_left"
                android:src="@drawable/icn_close"
                android:contentDescription="@null"/>    
        </FrameLayout>
    </LinearLayout>      
</RelativeLayout>

上面的布局放在单独的preview.xml文件中,然后包含在主布局中,如下所示:

<include
        android:id="@+id/fragment_main_loyalty_preview_container"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_below="@id/fragment_main_loyalty_logo_container"
        android:layout_above="@id/fragment_main_loyalty_buttons_container"
        android:layout_marginTop="@dimen/fragment_main_loyalty_preview_container_margin_top"
        android:layout_marginBottom="@dimen/fragment_main_loyalty_preview_container_margin_bottom"      
        android:visibility="visible"
        layout="@layout/preview"/>

更新

如果我用FrameLayout左右替换托管ScrollView,问题就会消失。

我真的不明白为什么中间父母提出罚款并且其子女受到最高父母的影响:)

只需在设计器中切换目标API,就可以在Eclipse中重现这种情况。

更新 - 简化测试案例

以下是我能够创建并重现我的问题的最简单的布局。 基本上红色区域应放在绿色和蓝色区域之间。 红色区域的高度应该与绿色和蓝色视图之间的可用空间匹配,因为还有另一个视图(参见@ id / margin_placeholder),这个高度会影响这两个视图之间的距离。

在红色区域内,我想把白色视图放在红色区域的底部。 这个小白人在Android 6.0上呈现出不同的方式:

lollipop fine marshmallow bad

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <FrameLayout
            android:id="@+id/top"
            android:layout_width="match_parent"
            android:layout_height="90dp"
            android:layout_marginTop="10dp"
            android:background="#007700"/>

        <View
            android:id="@+id/margin_placeholder"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:layout_below="@id/top"/>

        <FrameLayout
            android:id="@+id/bottom"
            android:layout_width="match_parent"
            android:layout_height="90dp"
            android:layout_below="@id/margin_placeholder"
            android:background="#000077"/>

        <RelativeLayout
            android:id="@+id/middle"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_below="@id/top"
            android:layout_above="@id/bottom"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp"
            android:background="#770000">
            <View
                android:layout_width="16dp"
                android:layout_height="8dp"
                android:layout_marginRight="16dp"
                android:layout_alignParentBottom="true"
                android:layout_alignParentRight="true"
                android:background="#ffffff"/>
        </RelativeLayout>       
    </RelativeLayout>
</ScrollView>

1 个答案:

答案 0 :(得分:0)

如果我将targetSdkVersion从16升级到20,它会呈现正常。