web-dev-qa-db-fra.com

Commutateur personnalisé - La taille des pistes et des sélecteurs ne fonctionne pas en dessous de 21 API

Le bouton de forme personnalisée ressemble à ça:

Ci-dessus API 21

 enter image description here

Ci-dessous API 21

 enter image description here

On dirait que le bloc <size/> ne fonctionne pas dans <shape/> pour les 21 API antérieures. 

Des idées comment résoudre ce problème?


CODE

conteneur.xml:

<Switch
        Android:id="@id/switch_follow"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentEnd="true"
        Android:layout_alignParentRight="true"
        Android:layout_centerVertical="true"
        Android:textOff=""
        Android:textOn=""
        Android:thumb="@drawable/switch_selector"
        Android:track="@drawable/switch_track"/>

drawable/switch_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
    <layer-list>
        <item
            Android:bottom="@dimen/switch_selector_padding"
            Android:left="@dimen/switch_selector_padding"
            Android:right="@dimen/switch_selector_padding"
            Android:top="@dimen/switch_selector_padding">
            <shape
                Android:dither="true"
                Android:shape="oval"
                Android:useLevel="false"
                Android:visible="true">
                <gradient
                    Android:angle="270"
                    Android:endColor="@color/primary_white"
                    Android:startColor="@color/primary_white"/>
                <corners
                    Android:radius="@dimen/switch_radius"/>
                <size
                    Android:width="@dimen/switch_track_height"
                    Android:height="@dimen/switch_track_height" />
            </shape>
        </item>

    </layer-list>
</item>
</selector>

drawable/switch_track.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:dither="true"
Android:shape="rectangle"
Android:useLevel="false"
Android:visible="true">
<gradient
    Android:angle="270"
    Android:endColor="@color/primary_yellow_dark_v2"
    Android:startColor="@color/primary_yellow_dark_v2"/>
<corners Android:radius="@dimen/switch_radius" />
<stroke
    Android:width="@dimen/switch_stroke_height"
    Android:color="@Android:color/transparent">
</stroke>
<size
    Android:width="@dimen/switch_track_width"
    Android:height="@dimen/switch_track_height" />
</shape>

Peut-être que quelqu'un a été confronté à un problème similaire. S'il vous plaît partager votre expérience. 


EDIT: ajout des dimensions utilisées

<dimen name="switch_track_width">36dp</dimen>
<dimen name="switch_track_height">30dp</dimen>
<dimen name="switch_radius">50dp</dimen>
<dimen name="switch_selector_padding">2dp</dimen>
<dimen name="switch_stroke_height">0dp</dimen>
16
AnZ

Tout va bien avec la balise <size />. La Drawable est créée et appliquée correctement. Votre problème se situe complètement dans la Switch.

Dans les versions antérieures, le pouce avant Lollipop était utilisé avec du texte et le dessin était simplement une image d’arrière-plan qui était redimensionnée à la taille requise. Vous pouvez le vérifier en ajoutant du texte aux attributs textOff et textOn. De plus, une largeur minimale est définie.

Il suffit donc d’ajouter une switchMinWidth de 0 et une thumbTextPadding de la moitié du diamètre du pouce

<Switch
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:switchMinWidth="0dp"
    Android:textOff=""
    Android:textOn=""
    Android:thumb="@drawable/switch_selector"
    Android:thumbTextPadding="@dimen/switch_thumb_radius"
    Android:track="@drawable/switch_track" />

et une définition correcte du rayon pour cela

<dimen name="switch_track_height">30dp</dimen>
<dimen name="switch_thumb_radius">15dp</dimen>
10
tynn

J'ai copié votre code et essayé d'implémenter dans ma machine, la première chose dans votre propriété drawable/switch_selector.xml à l'intérieur de <size> width devrait avoir switch_track_width au lieu de switch_track_height: 

<size
  Android:width="@dimen/switch_track_width"
  Android:height="@dimen/switch_track_height" />

Cela résoudra votre problème, mais je suggèrerais un fichier dimens.xml supplémentaire dans le répertoire res/values-v21 et ajouter 

<dimen name="switch_track_width">30dp</dimen>  //change as per your view appreance
<dimen name="switch_track_height">25dp</dimen> //change as per your view appreance
<dimen name="switch_radius">50dp</dimen> //change as per your view appreance
<dimen name="switch_selector_padding">2dp</dimen>
<dimen name="switch_stroke_height">0dp</dimen>

Vous pouvez également modifier la largeur, la hauteur et le rayon de res/values ​​/ dimens.xml.

J'espère que ça va aider.

1
Rajendra

Vous pouvez utiliser ce widget "Android.support.v7.widget.switchcompat" .Il prend en charge la compatibilité descendante.

0
kidyu