Android 布局不需要的填充
Android layout unwanted padding
所以我有这个布局文件(如下)。如您所见,没有填充或边距。 dimen.xml 文件也没有任何 padding/margin。最后,我根本不以编程方式更改布局。
<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 注:
HTC 欲望 550:
知道这可能是什么原因吗?
可能的原因是HTC手机尤其有不同类型的内部布局文件。所以 Lenovo Nexus 和 SAMSUNG 可能会正常运行,但由于 HTC 在这些情况下的不同,这对很多开发人员来说是个大问题。如果您确实希望它也能在 HTC 上运行,我建议让它在 HTC 上运行的最佳方法是创建您自己的 xml 文件,类似于 android 支持文件。如果您想继续,我建议您尝试掌握 android 卡的原生 xml 文件并使用相同的文件。现在 HTC 必须使用您自定义的,这与所有其他 android 相同,但在 HTC 中不是。我的意思是现在它将在所有设备上正常工作。但请注意,如果您无法掌握本机 xml 文件,这可能会变得漫长而痛苦。如果你这样做了,那么对你来说可能会变得轻而易举。我希望你能理解我。
好的,伙计们...感谢您的输入。结果 "Cardview Documentation" 提到:
Before L, CardView adds padding to its content and draws shadows to that area. This padding amount is equal to maxCardElevation + (1 - cos45) * cornerRadius on the sides and maxCardElevation * 1.5 + (1 - cos45) * cornerRadius on top and bottom.
这意味着边距是绘制阴影和模拟高程的预期行为。对于遇到同样问题的每个人,一种可能的解决方案是在您的布局中使用属性 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>
这将导致您的布局在每台设备上都是 "rendered" 相同的方式(Lollipop 之前的方式 //sad ),而不管 API。至少这样我们可以修复一个适用于所有版本的通用布局。
希望对您有所帮助。
更新: 如果您决定选择 "app:cardUseCompatPadding=true",这里有另一个建议。使用负 layout_margin 来平衡兼容库中不需要的填充。示例如下:
<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>
这样您的布局就可以去掉不需要的填充,并且在棒棒糖之前和之后看起来一样。
希望这对您有所帮助。 :)
您是否尝试过设置线性布局的高度或将其设置为与父布局匹配?似乎没有额外的填充,而是列表中的项目与图像的高度不同,甚至被截断了。
所以我有这个布局文件(如下)。如您所见,没有填充或边距。 dimen.xml 文件也没有任何 padding/margin。最后,我根本不以编程方式更改布局。
<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 注:
HTC 欲望 550:
知道这可能是什么原因吗?
可能的原因是HTC手机尤其有不同类型的内部布局文件。所以 Lenovo Nexus 和 SAMSUNG 可能会正常运行,但由于 HTC 在这些情况下的不同,这对很多开发人员来说是个大问题。如果您确实希望它也能在 HTC 上运行,我建议让它在 HTC 上运行的最佳方法是创建您自己的 xml 文件,类似于 android 支持文件。如果您想继续,我建议您尝试掌握 android 卡的原生 xml 文件并使用相同的文件。现在 HTC 必须使用您自定义的,这与所有其他 android 相同,但在 HTC 中不是。我的意思是现在它将在所有设备上正常工作。但请注意,如果您无法掌握本机 xml 文件,这可能会变得漫长而痛苦。如果你这样做了,那么对你来说可能会变得轻而易举。我希望你能理解我。
好的,伙计们...感谢您的输入。结果 "Cardview Documentation" 提到:
Before L, CardView adds padding to its content and draws shadows to that area. This padding amount is equal to maxCardElevation + (1 - cos45) * cornerRadius on the sides and maxCardElevation * 1.5 + (1 - cos45) * cornerRadius on top and bottom.
这意味着边距是绘制阴影和模拟高程的预期行为。对于遇到同样问题的每个人,一种可能的解决方案是在您的布局中使用属性 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>
这将导致您的布局在每台设备上都是 "rendered" 相同的方式(Lollipop 之前的方式 //sad ),而不管 API。至少这样我们可以修复一个适用于所有版本的通用布局。
希望对您有所帮助。
更新: 如果您决定选择 "app:cardUseCompatPadding=true",这里有另一个建议。使用负 layout_margin 来平衡兼容库中不需要的填充。示例如下:
<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>
这样您的布局就可以去掉不需要的填充,并且在棒棒糖之前和之后看起来一样。
希望这对您有所帮助。 :)
您是否尝试过设置线性布局的高度或将其设置为与父布局匹配?似乎没有额外的填充,而是列表中的项目与图像的高度不同,甚至被截断了。