Change Chip Widget style programmatically not working - Android

后端 未结 3 1715
说谎
说谎 2020-12-02 01:53

I\'m doing a list with Chips. I want this chips can be selected, so, taking a look to https://material.io/develop/android/components/chip/ I see I can have a \"Choice Chip\"

相关标签:
3条回答
  • 2020-12-02 02:03

    You can't use the constructor val chip = Chip(context, null, R.style.CustomChipChoice) because the 3rd parameter isn't the style but the attribute in the theme as R.attr.chipStyle.
    The Chip hasn't a constructor with 4 parameters as other components because it extends AppCompatCheckbox which does not support a 4 parameter constructor.

    However you can use something different.
    1st option:

    Just use a xml layout (single_chip_layout.xml) to define the single Chip with your favorite style:

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

    with

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

    Then instead of val chip = Chip(context, null, R.style.CustomChipChoice) use:

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

    In java:

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

    2nd option:

    Another option is to use the setChipDrawable method to override the ChipDrawable inside the Chip:

      Chip chip = new Chip(this);
      ChipDrawable chipDrawable = ChipDrawable.createFromAttributes(this,
          null,
          0,
          R.style.Widget_MaterialComponents_Chip_Choice);
      chip.setChipDrawable(chipDrawable);
    
    0 讨论(0)
  • 2020-12-02 02:27

    In order to set the chip style in code you can try the following:

    val chip = Chip(context)
    val drawable = ChipDrawable.createFromAttributes(context, null, 0, R.style.Widget_MaterialComponents_Chip_Choice)
    chip.setChipDrawable(drawable)
    
    0 讨论(0)
  • 2020-12-02 02:27

    the CustomChipChoice is not a style it is just a reference to a style. therefore change R.style.CustomChipChoice to it : R.attr.CustomChipChoice

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

    but before it you should add this CustomChipChoicein values.xml file in your project. for this. if your project does not have the values.xml create it in values directory.

    then add CustomChipChoice like this.

    values.xml

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

    now in styles.xml add your style like this.

    styles.xml

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

    now that CustomChipChoice attr references to this style and now you can create your custom style in styles.xml file.

    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>
    

    if you want to change text appearance of chip. here is ChipTextStyleAppearance. you can add it like this.

    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>
    

    dont forget to add the AppTheme in androidManifest.xml on application or activity tags.

    androidManifest.xml

    <application
            .
            .
            android:theme="@style/AppTheme">
    
    <activity
                .
                .
                android:theme="@style/AppTheme" />
    
    0 讨论(0)
提交回复
热议问题