无法更改开关颜色

11

我想将这个颜色应用于所有开关,但默认情况下开关使用colorAccent而不是主题中的颜色。


设备:棉花糖(Android 6.0)。

布局:

<Switch
            android:id="@+id/soundSwitch"
            style="@style/SwitchStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginBottom="@dimen/large_space"
            android:layout_marginRight="@dimen/medium_space"
            android:layout_marginTop="@dimen/large_space"
            android:checked="true"
            />

样式-v21:

<style name="SwitchStyle" parent="Theme.AppCompat.Light">
        <!-- active thumb & track color (30% transparency) -->
        <item name="android:colorControlActivated">@color/switch_color</item>

        <!-- inactive thumb color -->
        <item name="colorSwitchThumbNormal">#f1f1f1</item>

        <!-- inactive track color (30% transparency) -->
        <item name="android:colorForeground">#42221f1f</item>
    </style>

我做错了什么?


如果你在尝试并失败后,可以通过覆盖colorAccent来获得一个简短的替代方案 <item name="colorAccent">你的颜色</item> - Xenolion
4个回答

24

你把样式主题混在一起了。

这些属性是主题属性,所以应该在一个主题覆盖中定义它们:

res/values/styles.xml(不是values-v21)

<style name="ThemeOverlay.MySwitch" parent="">
    <item name="android:colorControlActivated">@color/switch_color</item>
    <item name="android:colorSwitchThumbNormal">#f1f1f1</item>
    <item name="android:colorForeground">#42221f1f</item>
</style>

<style name="ThemeOverlay.MySwitchCompat" parent="">
    <item name="colorControlActivated">@color/switch_color</item>
    <item name="colorSwitchThumbNormal">#f1f1f1</item>
    <item name="android:colorForeground">#42221f1f</item>
</style>

然后将主题叠加层应用于开关:

res/layout/layout.xml

<Switch
    android:theme="@style/ThemeOverlay.MySwitch"/>

<androidx.appcompat.widget.SwitchCompat
    android:theme="@style/ThemeOverlay.MySwitchCompat"/>

选择两个变体之一:

  • Switch 从API 21开始可用,所有主题属性都以 android: 为前缀。
  • SwitchCompat 可在AndroidX AppCompat库中使用,某些主题属性未带前缀(请确保您知道哪些)。
  • Switch 从API 21开始可用,所有主题属性都以 android: 为前缀。
  • SwitchCompat 可在AndroidX AppCompat库中使用,某些主题属性未带前缀(请确保您知道哪些)。

嗨,我知道这是一个旧答案,但您能否解释一下当您说“您正在混合样式和主题。这些属性是主题属性,因此请在主题叠加中定义它们”时是什么意思?我现在也遇到了同样的问题,尝试通过style属性将主题应用于Switch组件,但没有任何变化,而通过theme属性应用主题却有效果。您能解释一下您的意思吗? - Eitanos30
请查看Android开发者YouTube频道,寻找来自Google I/O或其他会议的Nick Butcher或Chris Banes解释该主题的视频。 - Eugen Pechanec
谢谢。但是你给了我一个有很多视频的链接,我不能看完所有视频来得到我的问题的答案:( - Eitanos30
1
谢谢,我已经看完了。讲师说:“coloraccent是一个主题属性,所以不要尝试在布局中使用它,因为什么也不会发生”。但是,他根本没有提到样式属性,我认为我有问题,不理解当视图被膨胀时如何处理主题属性,例如textAppearance、theme、style等。我开始观看https://www.youtube.com/watch?v=TIHXGwRTMWI,希望这能帮助我理解。如果您有其他帮助我的来源,我将非常感激。谢谢! - Eitanos30
2
在苦苦挣扎了几个小时之后,只有一件事是肯定的:Android上的样式和主题真的很让人头疼。 - voghDev
显示剩余2条评论

4

可以尝试使用android.support.v7.widget.SwitchCompat替代Switch,并使用android:theme=@style/SwitchStyle替代style="@style/SwitchStyle"


1
Kozrev,您能否解释一下为什么我们需要使用android:theme而不是style?我试图理解它,但没有成功。 - Eitanos30

3
将以下内容添加到style.xml以进行开关样式设置。
<style name="SwitchThemeOverlay" parent="">
    <!-- active thumb & track color (30% transparency) -->
    <item name="colorControlActivated">#00c853</item>

    <!-- inactive thumb color -->
    <item name="colorSwitchThumbNormal">#CC0000</item>

    <!-- inactive track color (30% transparency) -->
    <item name="android:colorForeground">#666666
    </item>
</style>

在您的 XML 中使用以下代码:
 <android.support.v7.widget.SwitchCompat
        android:id="@+id/switch_desc"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textColor="@color/colorPrimaryDark"
        android:padding="5dp"
        android:checked="false"
        android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"
        android:theme="@style/SwitchThemeOverlay"
        android:layout_marginLeft="10dp"
        android:text="Description"/>

我将“Style”更改为“ThemeOverlay”,以更好地描述发生的情况。 - Eugen Pechanec

1

我的回答是为那些想要更改开关颜色并删除默认不透明度的人而设的。请按照以下步骤进行:

  1. 在您的布局xml文件中,将Switch替换为androidx.appcompat.widget.SwitchCompat

  2. 在styles.xml文件中创建一个新样式,如下所示

    <style name="SwitchCompatStyle" > <item name="thumbTint">@color/switch_thumb</item> <item name="trackTint">@color/switch_track_selector</item> </style>

  3. 在您的androidx.appcompat.widget.SwitchCompat标记中添加此行 style="@style/SwitchCompatStyle"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接