【问题标题】:Remove margin from ListView item background从 ListView 项目背景中删除边距
【发布时间】:2014-03-01 02:31:03
【问题描述】:

我正在开发一个主题,通过将android:listSelector 设置为我编写的选择器来设置我的应用程序的 ListViews 样式:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/listitem_pressed" />
    <item android:drawable="@drawable/listitem_selected" />
</selector>

这会更改在按下或选择时显示在单个列表项/行后面的背景。在这种情况下,listitem_pressed 是一个 9-Patch PNG,而 listitem_selected 是一个定义渐变的 XML 可绘制对象。这可行,但我注意到渐变占用了所有可用空间,而 PNG 周围有 4 或 5 像素的边距。

边距从何而来,为什么 PNG 的行为与 XML 可绘制对象不同?有没有一种简单的方法可以摆脱它?如果可能的话,我希望能够仅使用主题(在应用程序级别,在清单中指定)来设置我的应用程序的样式,而无需设置单个 ListView 实例的样式,覆盖ListAdapter.getView() 等。

【问题讨论】:

  • 如果您没有在 9-patch 中明确定义内容区域,则系统会使用补丁区域隐式定义它,并相应地设置它的填充。如果要禁用填充,则明确定义内容区域以包含整个可绘制区域。
  • @corsair992 谢谢。我发现 9-patch 实际上有一个边距,但你的建议仍然有帮助。当我删除边距时,我发现背景正在“逃脱”其边界并与其他列表项重叠。显式设置内容区域解决了这个问题。

标签: android android-listview android-theme android-styles


【解决方案1】:

虽然我遇到的问题部分是由于我没有意识到给我的 PNG(它的边框周围有空格),但一旦我删除了它,我又遇到了另一个背景问题实际上与其他列表项重叠。 Corsair992 给我的建议解决了这个问题:

在 9 Patch 中指定内容区域来修复它,而不是依赖 Android 的默认值来绘制可绘制的边距和内容区域。

【讨论】: