在Android Lollipop for Material Design中为SwitchCompat按钮设置样式/着色

时间:2014-12-08 10:51:39

标签: android android-5.0-lollipop material-design android-switch

我一直在努力寻找资源,解释如何设置Material Design主题中Switch按钮的样式。

这个链接确实解释了颜色值和美学细节,但没有说明我如何通过在Material design主题中设置某些属性来实现这一点。

  

http://www.google.com/design/spec/components/switches.html#switches-switch

如果没有直接的方法来设置Switch的颜色,那么我可以使用哪些drawable来制作我自己的版本?

3 个答案:

答案 0 :(得分:17)

  

我一直在努力寻找资源,解释如何在Material Design主题中设置切换按钮的样式。

使用新的appcompat-v7:21,着色小部件非常简单。

只要您使用appcompat-v7:21,就可以使用Switch小部件替换所有旧的SwitchCompat小部件。因此,在xml布局中,不要使用旧的Switch标记,而是使用android.support.v7.widget.SwitchCompat

然后在您的styles.xml中,确保您应用的父主题是Theme.AppCompat主题,例如Theme.AppCompat.Light

最后,关键是为colorAccent指定自己的值:

<item name="colorAccent">@color/my_fancy_color</item>

您为colorAccent指定的颜色将用于为应用中的小部件添加颜色,例如SwitchCompatsEditTextsRadioButtons等。

所以你的styles.xml可能看起来像:

<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">
    <!-- colorPrimary is used for the default action bar background -->
    <item name="colorPrimary">@color/color_primary</item>

    <!-- colorPrimaryDark is used to color the status bar -->
    <item name="colorPrimaryDark">@color/color_primary_dark</item>

    <!-- 
         colorAccent is used as the default value for colorControlActivated
         which is used to color widgets 
    -->
    <item name="colorAccent">@color/my_fancy_color</item>

    <!-- You can also set colorControlNormal, colorControlActivated
         colorControlHighlight & colorSwitchThumbNormal. -->
</style>
  

我可以使用哪些drawables来制作我自己的版本?

我不建议直接更改drawable,但它们位于

sdk/platforms/android-21/data/res/drawable-XXXX

并调用文件

btn_switch_to_off_mtrl_XXXXX.9.png

btn_switch_to_on_mtrl_XXXXX.9.png

switch_track_mtrl_alpha.9.png

答案 1 :(得分:6)

完成JDJ的回答:

AppCompat中的drawable-hdpi中存在损坏文件的错误:

https://code.google.com/p/android/issues/detail?id=78262

要修复它,只需使用这两个文件覆盖它:

https://github.com/lopespm/quick-fix-switchcompat-resources

将它们添加到drawable-hdpi目录中。

XML

<android.support.v7.widget.SwitchCompat
android:id="@+id/dev_switch_show_dev_only"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

Java中没有必要

答案 2 :(得分:2)

在我的情况下,我只想设置一个特定的开关,而不是应用程序中的所有开关。以下是我使用AppCompat-v7:23

的方法

xml layout:

<android.support.v7.widget.SwitchCompat
                android:id="@+id/switchAffiliateMember"
                android:theme="@style/Sugar.Switch.Affiliate"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:checked="true"
                android:textOff="No"
                android:textOn="Yes" />

V21 / styles.xml:

<style name="Sugar.Switch.Affiliate" parent="Base.Widget.AppCompat.CompoundButton.Switch">
    <item name="colorSwitchThumbNormal">@color/red</item>
    <item name="colorAccent">@color/white</item>
</style>

colorSwitchThumbNormal是&#34; off&#34; state,colorAccent是&#34; on&#34;州。请注意,这些都没有&#34; android&#34;命名空间前缀,我不明白为什么,但它只对我有用。