Android布局不需要的填充

时间:2015-08-25 13:15:05

标签: android layout margin padding

所以我有这个布局文件(下面)。如您所见,没有填充或边距。 dimen.xml文件也没有任何填充/边距。最后,我根本不会以编程方式更改布局。

      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/root"
            android:padding="0dp"
            android:orientation="vertical">

            <android.support.v7.widget.CardView
                android:id="@+id/toolbarholder"
                android:layout_alignParentTop="true"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:cardElevation="16dp"
                app:cardCornerRadius="0dp">
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">



            </android.support.v7.widget.Toolbar>
            </android.support.v7.widget.CardView>


            <ListView
                android:layout_below="@+id/toolbarholder"
                android:layout_above="@+id/cardroot"
                android:id="@+id/listView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:divider="@null"
                android:dividerHeight="0dp"
                android:layout_marginTop="0dp" />


            <android.support.v7.widget.CardView
                xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                android:id="@+id/cardroot"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:background="@color/transparentblack"
                app:cardCornerRadius="0dp"
                app:cardElevation="16dp"
                android:layout_alignParentBottom="true">

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

                    <LinearLayout
                        android:id="@+id/buttonholder"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="20dp"
                        android:weightSum="3">

                        <ImageView
                            android:id="@+id/previous"
                            android:layout_width="35dp"
                            android:layout_height="35dp"
                            android:src="@drawable/previous"
                            android:layout_weight="1"/>
                        <ImageView
                            android:id="@+id/play"
                            android:layout_width="35dp"
                            android:layout_height="35dp"
                            android:src="@drawable/play"
                            android:layout_weight="1"/>
                        <ImageView
                            android:id="@+id/next"
                            android:layout_width="35dp"
                            android:layout_height="35dp"
                            android:src="@drawable/next"
                            android:layout_weight="1"/>

                    </LinearLayout>

                    <SeekBar
                        android:id="@+id/seekbar"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_below="@+id/buttonholder" />

                </RelativeLayout>

            </android.support.v7.widget.CardView>

        </RelativeLayout>

以下是来自两个不同设备的两个屏幕截图。

联想k3注意:

enter image description here

HTC Desire 550:

enter image description here

任何想法可能是什么原因?

3 个答案:

答案 0 :(得分:9)

好的伙计们......感谢您的投入。结果"Cardview Documentation"提到:

  

在L之前,CardView会在其内容中添加填充并为该区域绘制阴影。此填充量等于两侧的maxCardElevation +(1 - cos45)* cornerRadius,顶部和底部的maxCardElevation * 1.5 +(1 - cos45)* cornerRadius。

这意味着边距是绘制阴影和模拟高程的行为。对于每个遇到相同问题的人来说,一种可能的解决方案是在布局中使用属性cardUseCompatPadding,如下所示:

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardElevation="0dp"
    app:cardUseCompatPadding="true">
</android.support.v7.widget.CardView>

这将导致您的布局在每个设备中以相同的方式(前Lollipop方式//悲伤)“呈现”,无论API如何。至少这样我们可以修复一个适用于所有版本的公共布局。

希望它有所帮助。

更新:如果您决定选择“app:cardUseCompatPadding = true”,这是另一个建议。使用负布局_margin来平衡compat库中不需要的填充。示例如下:

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="-10dp"
    app:cardCornerRadius="0dp"
    app:cardUseCompatPadding="true"
    app:cardElevation="8dp">
</android.support.v7.widget.CardView>

通过这种方式,您的布局可以摆脱不必要的填充并在棒棒糖之后看起来相同的前棒棒糖。

希望这会有所帮助。 :)

答案 1 :(得分:0)

可能的原因是HTC手机尤其具有不同类型的内部布局文件。因此,联想Nexus和SAMSUNG可能正常运行,但由于HTC在这些情况下的不同,这对很多开发人员来说都是一个大问题。如果你真的希望它能够在HTC上工作,我建议让它在HTC上工作的最好方法是创建你自己的xml文件,类似于android支持的文件。我建议如果你想继续尝试获取android卡的本机xml文件的挂起并使用相同的。现在HTC必须使用你的自定义的那些与所有其他Android机器人相同但不在HTC中。我所说的是现在它可以在所有设备上正常工作。但要注意,如果您无法获取原生xml文件,这可能会变得漫长而痛苦。如果你这样做,那么对你来说可能会变得轻而易举。我希望你能理解我。

答案 2 :(得分:0)

您是否尝试过设置线性布局的高度或将其设置为与父级相匹配?它似乎没有额外的填充,而是列表中的项目与图像甚至被截断的高度不同。