web-dev-qa-db-ja.com

Android ListView Divider

私はこのコードを持っています:

<ListView
     Android:layout_width="wrap_content"
     Android:layout_height="wrap_content"
     Android:id="@+id/cashItemsList"
     Android:cacheColorHint="#00000000"
     Android:divider="@drawable/list_divider"></ListView>

ここで、@drawable/list_dividerは次のとおりです。

<shape
 xmlns:Android="http://schemas.Android.com/apk/res/Android"
 Android:shape="line">
 <stroke
   Android:width="1dp"
   Android:color="#8F8F8F"
   Android:dashWidth="1dp"
   Android:dashGap="1dp" />
</shape>

しかし、私は仕切りを見ることができません。

96
oriharel

皆さん、これが1dpまたは1dipではなく1pxを使用する理由です。1dpまたは1dipを指定すると、Androidが縮小します。 120dpiデバイスでは、0.75pxのように変換され、0に丸められます。一部のデバイスでは、2〜3ピクセルに変換され、通常はいまたはずさんに見えます。

仕切りの場合、1ピクセルの仕切りが必要な場合は1pxが正しい高さであり、「すべてをディップする必要があります」ルールの例外の1つです。すべての画面で1ピクセルになります。さらに、1pxは通常、hdpi以上の画面で見栄えがよくなります。

「もう2012年ではありません」編集:特定の画面密度から開始してdp/dipに切り替える必要がある場合があります

175
Joe Plante

これは回避策ですが、私には役立ちます:

次のようにres/drawable/divider.xmlを作成しました。

<?xml version="1.0" encoding="UTF-8"?>
<shape
  xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <gradient Android:startColor="#ffcdcdcd" Android:endColor="#ffcdcdcd" Android:angle="270.0" />
</shape>

また、リストビューアイテムのstyles.xmlに、次の行を追加しました。

    <item name="Android:divider">@drawable/divider</item>
    <item name="Android:dividerHeight">1px</item>

重要な部分は、この1px設定を含めることでした。もちろん、drawableは勾配(1px)を使用しますが、これは最適なソリューションではありません。ストロークを使用してみましたが、機能しませんでした。 (スタイルを使用していないように見えるため、ListViewにAndroid:dividerHeight = "1px"属性を追加するだけです。

53
Mika Vatanen

Android:dividerHeight="1px"を追加すると、動作します:

<ListView
     Android:layout_width="wrap_content"
     Android:layout_height="wrap_content"
     Android:id="@+id/cashItemsList"
     Android:cacheColorHint="#00000000"
     Android:divider="@drawable/list_divider" Android:dividerHeight="1px"></ListView>
26

あなたが抱えている問題は、必要なAndroid:dividerHeightが不足しているという事実と、いくつかの分周器ではできないドロアブルで線の太さを指定しようとしているという事実に起因しています奇妙な理由。基本的にあなたの例を動作させるには、次のようなことができます:

長方形または線のいずれかとしてドロアブルを作成します。どちらでも機能しますが、寸法を設定することはできません。

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="line">
     <stroke Android:color="#8F8F8F" Android:dashWidth="1dp" Android:dashGap="1dp" />
</shape>

または:

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"  Android:shape="rectangle">
     <solid Android:color="#8F8F8F"/>
</shape>

次に、カスタムスタイルを作成します(好みだけですが、私はものを再利用できるようにしたいです)

<style name="dividedListStyle" parent="@Android:style/Widget.ListView">
    <item name="Android:cacheColorHint">@Android:color/transparent</item>
    <item name="Android:divider">@drawable/list_divider</item>
    <item name="Android:dividerHeight">1dp</item>
</style>

最後に、カスタムスタイルを使用してリストビューを宣言します。

<ListView
     style="@style/dividedListStyle"
     Android:layout_width="wrap_content"
     Android:layout_height="wrap_content"
     Android:id="@+id/cashItemsList">
</ListView>

これらのスニペットの使用方法を知っていると思われますが、そうでない場合はお知らせください。基本的にあなたの質問への答えは、ドロアブルでディバイダーの太さを設定できないことです。そこで幅を未定義のままにし、代わりにAndroid:dividerHeightを使用して設定する必要があります。

15
Justin Buser

ドキュメントから:

public void setDivider(Drawable divider) on ListView

/**
 * Sets the drawable that will be drawn between each item in the list. If the drawable does
 * not have an intrinsic height, you should also call {@link #setDividerHeight(int)}
 *
 * @param divider The drawable to use.
 */

仕切りが固有の高さを持たない場合に表示するには、setDividerHeight()を呼び出す必要があります

8
Plantage

@drawable/list_divideは次のようになります。

<shape
 xmlns:Android="http://schemas.Android.com/apk/res/Android"
 Android:shape="line">
 <stroke
   Android:height="1dp"
   Android:color="#8F8F8F"
   Android:dashWidth="1dp"
   Android:dashGap="1dp" />
</shape>

ご使用のバージョンでは、Android:width="1dp"を指定しますが、それをAndroid:height="1dp"に変更するだけで機能します。

5
Christian

doc から:

ファイルの場所:

res/drawable/filename.xml

ファイル名はリソースIDとして使用されます。

基本的に、list_divider.xmlという名前のファイルをres/drawable/に配置して、R.drawable.list_dividerとしてアクセスできるようにする必要があります。その方法でアクセスできる場合は、ListViewのXMLでAndroid:divider="@drawable/list_divider"を使用できます。

4
Lie Ryan

一部の人々は実線を経験しているかもしれません。これを回避するには、ドローアブルを参照するビューにAndroid:layerType="software"を追加しました。

2
JeremyDay

同じ問題がありました。ただし、ビューを1pxにすると、元のNexus 7では動作しなかったようです。画面密度が213で、xhdpiで使用されている240未満であることに気付きました。そのため、デバイスはmdpi密度であると考えていました。

私の解決策は、dimensフォルダーにdividerHeightパラメーターが含まれるようにすることでした。 2dpフォルダーではvalues-mdpiに設定しますが、1dp etcフォルダーではvalues-hdpiに設定します。

1
RCB

Androidのドキュメントは、四捨五入エラーのために消失するものについて警告します...おそらく、pxではなくdpを試してください。

http://developer.Android.com/guide/practices/screens_support.html#testing を参照してください

セクション「1ピクセルの高さ/幅の画像」

1
dnunn0

あなたはあなたのディバイダーxmlレイアウトのディバイダーの終わりに「r」を忘れました

レイアウトを@ drawable/list_dividerと呼びますが、divider xmlの名前は「list_divide」です

1
K C