如何在Android中创建带虚线/点线分隔符的ListView?

13

我成功地找到了如何创建一个自定义形状(带有虚线边框)的方法,需要在 /app/res/drawable/ 文件夹中创建名为 dash.xml 的文件:

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line">
    <stroke
        android:color="#534b4b"
        android:width="1dp"
        android:dashGap="2dp"
        android:dashWidth="1dp"
    />
    <size
        android:height="1dp"
    />
</shape>

现在我不知道如何将这个形状应用到ListView上。我尝试了以下方法,但没有显示分隔线:

<ListView android:id="@+id/android:list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:cacheColorHint="#00000000"
    android:divider="@drawable/dash"
    android:dividerHeight="1dp"
/>

什么鬼?

3个回答

34

这是我的代码,它可以工作:

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line">
    <stroke
        android:color="#FF404040"
        android:width="1dp"
        android:dashGap="3dp"
        android:dashWidth="1dp"
    />
    <size
        android:height="3dp"
    />
</shape>

11
您可能还需要将 android:layerType="software" 添加到引用该形状的节点中。在某些设备上,虚线可能会显示为实线。 - Steven
一个解决实线问题的 layerType 设备示例是带有 4.4.3 版本的 Nexus 5。 - Michael Kariv
这个版本似乎是有效的,因为有 height="3dp"。在我看来,这似乎是 GradientDrawable 的一个 bug:如果高度 - 2 * 描边宽度 <= 0,则线条将不会被绘制。对于矩形形状来说,这实际上是有意义的,但对于一条线来说则不然。 - ChristophK
另外,正如之前提到的那样,您必须为较新版本的Android使用软件层,因为硬件加速不支持虚线。请参见https://code.google.com/p/android/issues/detail?id=29944。 - ChristophK

7

您还需要使用android:dividerHeight。形状的大小是可变的,目前您的分隔线高度为零。


抱歉,我在上面的示例中忘记添加了一个dividerHeight,但是在测试时已经包含了。感谢您指出! - iamkoa

2
  1. 定义layerType以显示虚线分隔线,不要忘记给出分隔线的高度。

<ListView android:id="@+id/android:list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:cacheColorHint="#00000000" android:divider="@drawable/dash" android:dividerHeight="1dp" android:layerType="software"/>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接