web-dev-qa-db-fra.com

Comment appliquer un style personnalisé à SwitchCompat

Je voudrais appliquer un style personnalisé à SwitchCompat. Modifiez les tirables et le texte pour l'état activé et désactivé. Comment puis-je atteindre cet objectif? Je ne trouve aucun exemple sur la façon dont cela est fait. J'ai essayé ce qui suit dans mon styles.xml mais apparemment, je n'utilise pas le bon parent:

<style name="Switch" parent="Android:Widget.AppCompat.Widget.CompoundButton.SwitchCompat">
    <item name="Android:textOn">@string/common_yes</item>
    <item name="Android:textOff">@string/common_no</item>
    <item name="Android:thumb">@drawable/btn_switch_selector</item>
    <item name="Android:track">@drawable/btn_switch_bg_selector</item>
</style>

Modifier

J'ai réussi à changer les drawables dans le code.

switchView.setThumbResource(R.drawable.btn_switch_selector);
switchView.setTrackResource(R.drawable.btn_switch_bg_selector);

mais je n'ai pas encore trouvé de moyen de changer le texte du commutateur. L'extrait suivant ne semble pas fonctionner. Peut-être que je dois définir des propriétés de texte supplémentaires?

switchView.setTextOn(context.getString(R.string.common_yes));
switchView.setTextOff(context.getString(R.string.common_no));

Selon le code source de SwitchCompat, le texte activé/désactivé doit être pris en charge: https://Android.googlesource.com/platform/frameworks/support/+/421d8baa4a524e1384bcf033360bccaf8d55081d/v7/appcompat/src/Android/support/ v7/widget/SwitchCompat.Java

La propriété {@link #setText (CharSequence) text} contrôle le texte affiché dans l'étiquette du commutateur, tandis que le texte {@link #setTextOff (CharSequence) off} et {@link #setTextOn (CharSequence) on} contrôle le texte sur le pouce.

Modifier 2

Enfin trouvé une solution de code. Apparemment, setShowText() doit être définie sur true pour que le texte apparaisse sur le commutateur.

switchView.setTextOn(context.getString(R.string.common_yes));
switchView.setTextOff(context.getString(R.string.common_no));
switchView.setShowText(true);
switchView.setThumbResource(R.drawable.btn_switch_selector);
switchView.setTrackResource(R.drawable.btn_switch_bg_selector);

et solution xml

<Android.support.v7.widget.SwitchCompat
        Android:id="@+id/view_switch"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"            
        Android:thumb="@drawable/btn_switch_selector"
        app:track="@drawable/btn_switch_bg_selector"
        Android:textOn="@string/common_yes"
        Android:textOff="@string/common_no"
        app:showText="true" />

J'aimerais toujours savoir s'il existe un moyen de mettre cela dans styles.xml.

20
Wirling

Enfin, j'ai trouvé un moyen d'appliquer le même style à l'ensemble de mon application. Je mets la ligne suivante dans mon themes.xml

<item name="switchStyle">@style/Custom.Widget.SwitchCompat</item>

Et ce qui suit dans mon styles.xml

<style name="Custom.Widget.SwitchCompat" >
    <item name="Android:thumb">@drawable/btn_switch_selector</item>
    <item name="track">@drawable/btn_switch_bg_selector</item>
    <item name="showText">true</item>
    <item name="Android:textOn">@string/common_yes</item>
    <item name="Android:textOff">@string/common_no</item>
</style>
12
Wirling

Le style doit inclure le parent

<item name="switchStyle">@style/MySwitchCompat</item>

<style name="MySwitchCompat" parent="Widget.AppCompat.CompoundButton.Switch">
    <item name="Android:textColor">@color/accent</item>
    <item name="Android:fontFamily">sans-serif-light</item>
</style>
2
Pascalius