web-dev-qa-db-fra.com

Changer le style du widget de puce ne fonctionne pas par programme - Android

Je fais une liste avec Chips. Je veux que ces puces puissent être sélectionnées, donc, jetez un œil à https://material.io/develop/Android/components/chip/ Je vois que je peux avoir une "puce de choix".

Comme je dois créer et ajouter dynamiquement, je dois configurer avec des couleurs spécifiques, des ondulations de couleurs, ...

Donc ce que je dois configurer c'est:

val chip = Chip(context, null, R.style.CustomChipChoice)
            chip.isClickable = true
            chip.isCheckable = true
            chip.isCheckedIconVisible=false
            chip.height = ScreenUtils.dpToPx(40)
            chip.chipCornerRadius = (ScreenUtils.dpToPx(20)).toFloat()
            chip.chipStrokeWidth = (ScreenUtils.dpToPx(2)).toFloat()
            chip.setTextAppearanceResource(R.style.ChipTextStyle)
            return chip

Ce que j'essaie avec R.style.CustomChipChoice est:

Style CustomChipChoice

<style name="CustomChipChoice" parent="@style/Widget.MaterialComponents.Chip.Choice">
        <item name="chipBackgroundColor">@color/background_color_chip_state_list</item>
        <item name="chipStrokeColor">@color/background_color_chip_state_list</item>
        <item name="rippleColor">@color/topic_social_pressed</item>
</style>

background_color_chip_state_list

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:color="@color/topic_social_selected" Android:state_checked="true" />
    <item Android:color="@color/topic_social_pressed" Android:state_pressed="true" />
    <item Android:color="@color/topic_unselected_background" />
</selector>

stroke_color_chip_state_list

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:color="@color/topic_social_pressed" Android:state_checked="true"/>
    <item Android:color="@color/grey_material2" Android:state_checked="false"/>
</selector>

Comme vous pouvez le voir, je fais la puce, cliquable et vérifiable (cachant l'icône de vérification dont je n'ai pas besoin).

Mais quand je le teste, les couleurs ne sont pas définies. Les puces ressemblent simplement aux couleurs par défaut (échelle de gris)

Où puis-je appliquer ou comment ce style personnalisé?

P.S:

J'ai fait un test rapide, pour voir si mon CustomStyle était mal formé/etc ..

J'ai ajouté une vue via xml et j'ai parfaitement fonctionné ...

<Android.support.design.chip.Chip
                Android:id="@+id/test"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                style="@style/CustomChipChoice"
                Android:checkable="true"
                Android:clickable="true"
                app:checkedIconVisible="false"
                Android:text="Chip Test"/>
13
Shudy

Afin de définir le style de puce dans le code, vous pouvez essayer ce qui suit:

val chip = Chip(context)
val drawable = ChipDrawable.createFromAttributes(context, null, 0, R.style.Widget_MaterialComponents_Chip_Choice)
chip.setChipDrawable(drawable)
2
Tomer

Utilisez simplement une mise en page xml (single_chip_layout.xml) Pour définir l'unique Chip avec votre style préféré:

<com.google.Android.material.chip.Chip
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    style="@style/CustomChipChoice"
    ...
/>

avec

<style name="CustomChipChoice" parent="@style/Widget.MaterialComponents.Chip.Choice">
...
</style>

Alors au lieu de val chip = Chip(context, null, R.style.CustomChipChoice) utilisez

val chip = layoutInflater.inflate(R.layout.single_chip_layout, chipGroup, false) as Chip

En Java:

Chip chip =
          (Chip) getLayoutInflater().inflate(R.layout.single_chip_layout, chipGroup, false);
2

CustomChipChoice n'est pas un style, c'est juste une référence à un style. changez donc R.style.CustomChipChoice à: R.attr.CustomChipChoice

val newChip = Chip(context, null, R.attr.CustomChipChoice)

mais avant cela, vous devez ajouter ce CustomChipChoicein values.xml fichier dans votre projet. pour ça. si votre projet n'a pas le values.xml créez-le dans le répertoire values.

puis ajoutez CustomChipChoice comme ceci.

values.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="CustomChipChoice" format="reference" />
</resources>

maintenant en styles.xml ajoutez votre style comme ceci.

styles.xml

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
        .
        .
        <item name="CustomChipChoice">@style/CustomChipChoiceStyle</item>
        .
        .
</style>

maintenant que CustomChipChoice attr fait référence à ce style et maintenant vous pouvez créer votre style personnalisé dans styles.xml fichier.

styles.xml

<style name="CustomChipChoiceStyle" parent="@style/Widget.MaterialComponents.Chip.Action">
        .
        <item name="checkedIconVisible">false</item>
        <item name="Android:focusable">true</item>
        <item name="Android:clickable">true</item>
        <item name="chipBackgroundColor">@color/colorWhite</item>
        <item name="chipIcon">@drawable/ic_filter</item>
        <item name="chipIconVisible">true</item>
        <item name="textStartPadding">0dp</item>
        <item name="textEndPadding">0dp</item>
        .
        .
        <item name="Android:textAppearance">@style/ChipTextStyleAppearance</item>
</style>

si vous souhaitez modifier l'apparence du texte de la puce. voici ChipTextStyleAppearance. vous pouvez l'ajouter comme ceci.

styles.xml

<style name="ChipTextStyleAppearance">
        <item name="Android:fontFamily">@font/main_font</item>
        <item name="Android:textSize">13dp</item>
        <item name="Android:textColor">#ffffff</item>
</style>

n'oubliez pas d'ajouter le AppTheme dans androidManifest.xml sur application ou activity balises.

androidManifest.xml

<application
        .
        .
        Android:theme="@style/AppTheme">

<activity
            .
            .
            Android:theme="@style/AppTheme" />
0
Mojtaba Haddadi