设置com.google.android.material.chip.Chip选择的颜色

Jef*_*Liu 22 android material-design android-chips material-components-android

如何设置所选的com.google.android.material.chip.Chip颜色?我不希望它成为默认的灰色.这是一个单选芯片组.

在此输入图像描述

原始文档在这里

<com.google.android.material.chip.ChipGroup
    android:id="@+id/chipgroup"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="16dp"
    android:layout_marginTop="16dp"
    android:layout_marginEnd="16dp"
    app:checkedChip="@+id/chip_program"
    app:chipSpacingHorizontal="32dp"
    app:chipSpacingVertical="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/detailText"
    app:singleSelection="true">

    <com.google.android.material.chip.Chip
        android:id="@+id/chip_program"
        style="@style/Widget.MaterialComponents.Chip.Choice"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Program"
        app:chipEndPadding="16dp"
        app:chipStartPadding="16dp" />

    <com.google.android.material.chip.Chip
        android:id="@+id/chip_normal"
        style="@style/Widget.MaterialComponents.Chip.Choice"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/program_normal"
        app:chipEndPadding="16dp"
        app:chipStartPadding="16dp" />
</com.google.android.material.chip.ChipGroup>
Run Code Online (Sandbox Code Playgroud)

小智 26

只需设置一个属性app:chipBackgroundColor并将颜色状态列表传递给它:

<android.support.design.chip.Chip
    android:id="@+id/test"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checkable="true"
    android:clickable="true"
    android:focusable="true"
    app:chipBackgroundColor="@color/bg_chip_state_list"
    app:chipText="Test" />
Run Code Online (Sandbox Code Playgroud)

bg_chip_state_list 看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/colorSecondaryLight" android:state_checked="true" />
    <item android:color="@color/colorPrimaryDark" />
</selector>
Run Code Online (Sandbox Code Playgroud)

但是我也不得不设置android:clickabletrue使这项工作

  • 更好的提到文件位置是res/color/bg_c​​hip_state_list.xml (7认同)
  • 现在几乎是同样的问题,如何用文字颜色做同样的事情? (3认同)
  • 不过,我不需要将 clickable 设置为 true。 (2认同)
  • 我必须使用`state_selected`而不是`state_checked`使其起作用。我使用的是`Choice Chip`样式。 (2认同)

小智 11

使用ColorStateList是正确的方法。我要添加的唯一一件事是使用更清晰易读的自定义定义样式,尤其是在要自定义一系列属性的情况下。

除其他外,一种适用于所有视图的通用样式允许您在处进行更改,立即将其应用于所有视图

styles.xml

<style name="CustomChipChoice" parent="@style/Widget.MaterialComponents.Chip.Choice">
        <item name="chipBackgroundColor">@color/background_color_chip_state_list</item>
        <item name="android:textColor">@color/text_color_chip_state_list</item>
</style>
Run Code Online (Sandbox Code Playgroud)

text_color_chip_state_list.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true"
        android:color="@color/color_checked" />
    <item android:state_checked="false"
        android:color="@color/color_unchecked" />
</selector>
Run Code Online (Sandbox Code Playgroud)

background_color_chip_state_list.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/color1" android:state_checked="true" />
    <item android:color="@color/color2" />
</selector>
Run Code Online (Sandbox Code Playgroud)

之后,您需要对所有“芯片”视图应用自定义样式,如下所示。

<android.support.design.chip.Chip
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    style="@style/CustomChipChoice"
    android:checkable="true"
    android:clickable="true"
    android:focusable="true"
    android:text="Chip text" />
Run Code Online (Sandbox Code Playgroud)


Gab*_*tti 9

要更改中的颜色,Chip您可以使用自定义样式:

    <com.google.android.material.chip.Chip
        style="@style/My_Widget.MaterialComponents.Chip.Choice"
         ../>
Run Code Online (Sandbox Code Playgroud)

使用这种风格:

 <style name="My_Widget.MaterialComponents.Chip.Choice" parent="Widget.MaterialComponents.Chip.Choice">
    <!-- Chip background color selector -->
    <item name="chipBackgroundColor">@color/my_choice_chip_background_color</item>
    <!-- Border color -->
    <item name="chipStrokeColor">@color/primaryDarkColor</item>

    <!-- Chip text color selector -->
    <item name="android:textColor">@color/mtrl_choice_chip_text_color</item>
    <!-- Chip close icon color selector -->
    <item name="closeIconTint">@color/mtrl_chip_close_icon_tint</item>
  </style>
Run Code Online (Sandbox Code Playgroud)

对于chipBackgroundColor你可以使用这样的选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <!-- 24% opacity -->
  <item android:alpha="0.24" android:color="@color/custom" android:state_enabled="true" android:state_selected="true"/>
  <item android:alpha="0.24" android:color="@color/secondaryDarkColor" android:state_enabled="true" android:state_checked="true"/>
  <!-- 12% of 87% opacity -->
  <item android:alpha="0.10" android:color="@color/primaryLightColor" android:state_enabled="true"/>
  <item android:alpha="0.12" android:color="@color/colorPrimary"/>

</selector>
Run Code Online (Sandbox Code Playgroud)

对于文本颜色,您可以使用以下内容:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

  <item android:color="@color/colorAccent" android:state_enabled="true" android:state_selected="true"/>
  <item android:color="?attr/colorPrimary" android:state_enabled="true" android:state_checked="true"/>
  <!-- 87% opacity. -->
  <item android:alpha="0.87" android:color="?attr/colorOnSurface" android:state_enabled="true"/>
  <!-- 38% of 87% opacity. -->
  <item android:alpha="0.33" android:color="?attr/colorOnSurface"/>

</selector>
Run Code Online (Sandbox Code Playgroud)

正常/选定状态的结果:

在此处输入图片说明在此处输入图片说明


dit*_*itn 5

对于那些使用alpha-05,我发现state_checked在可过滤的 ( parent="Widget.MaterialComponents.Chip.Filter") 芯片上被忽略了。相反,您需要state_selected

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:color="@color/apricot" android:state_selected="true"/>
  <item android:color="@color/apricotSubtle"/>
</selector>
Run Code Online (Sandbox Code Playgroud)