J'ai créé une forme de rectangle afin de l'utiliser comme arrière-plan d'élément de liste. Mon problème est que le trait ne suit pas la bordure de la vue mais laisse une marge de +/- la largeur du trait.
Voici le xml de ma forme:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:innerRadiusRatio="1"
Android:shape="rectangle" >
<solid Android:color="@color/deminoir" />
<stroke
Android:width="4dp"
Android:color="@color/deminoir" />
<padding
Android:bottom="4dp"
Android:left="4dp"
Android:right="4dp"
Android:top="4dp" />
</shape>
Et voici le xml de mon style:
<style name="champ">
<item name="Android:layout_width">match_parent</item>
<item name="Android:layout_height">wrap_content</item>
<item name="Android:orientation">vertical</item>
<item name="Android:background">@drawable/bordurechamp</item>
</style>
Et enfin le xml de ma vue d'élément de liste:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
style="@style/champ" >
<!-- titre -->
<TextView
Android:id="@+id/titre"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@color/deminoir"
Android:padding="5dip"
Android:text="titre"
Android:textAppearance="@Android:style/TextAppearance.Large" />
<!-- Contenu -->
<TextView
Android:id="@+id/valeur"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:gravity="center_horizontal"
Android:padding="5dip"
Android:text="valeur"
Android:textAppearance="@Android:style/TextAppearance.Medium"
/>
</LinearLayout>
Entourez votre shape
de <item>...</item>
balises et configurer les attributs top
, bottom
, left
et right
de <item>
avec les valeurs de marge souhaitées. Enveloppez ensuite entier item
avec un <layer-list>
. Voir ci-dessous:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item
Android:left="{L-Margin}dp"
Android:right="{R-Margin}dp"
Android:bottom="{B-Margin}dp"
Android:top="{T-Margin}dp">
<!-- Insert your shape here: -->
<shape Android:shape="...">
...
</shape>
</item>
</layer-list>
De plus, si vous avez besoin de padding
(au lieu de margin
), voir réponse Ahmad Aghazadeh ci-dessous.
Vous pouvez utiliser le remplissage Transparent au lieu de la marge
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/listview_background_shape">
<stroke
Android:width="8dp"
Android:color="#0000000" />
<padding
Android:left="2dp"
Android:top="2dp"
Android:right="2dp"
Android:bottom="2dp" />
<solid
Android:color="@color/white" />
</shape>
J'ai eu le même problème et l'ai résolu comme ceci:
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
<shape
Android:shape="rectangle">
<solid Android:color="@color/background" />
<corners Android:radius="2dp"/>
<stroke
Android:width="4dp"
Android:color="@Android:color/black" />
</shape>
</item>
<item>
<shape
Android:shape="rectangle">
<corners Android:radius="2dp"/>
<solid Android:color="@Android:color/transparent" />
<stroke
Android:width="2dp"
Android:color="@color/background" />
</shape>
</item>
</layer-list>
Il donne deux drawables avec deux coups. Les premiers tirables ont un trait de largeur (largeur + marge du trait souhaité). Le deuxième dessinable n'a qu'un trait visible avec une largeur de marge souhaitable.