Стилизация/раскрашивание кнопки SwitchCompat в Android Lollipop для Material Design

Я пытался найти ресурсы, объясняющие, как я могу оформить кнопку Switch в теме Material Design.

Эта ссылка объясняет значения цвета и эстетические детали, но мало говорит о том, как я могу добиться этого, установив определенные атрибуты в теме дизайна материалов.

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

Если нет прямого способа установить цвет Switch, где находятся чертежи, которые я могу использовать для создания своей собственной версии?


person FoY    schedule 08.12.2014    source источник
comment
да нет прямого способа изменить. Вам нужно создать чертежи, если вы хотите изменить стили переключателей, кнопок и т.д....   -  person Murtaza Khursheed Hussain    schedule 08.12.2014
comment
@MurtazaHussain А вы знаете, где я могу найти рисунки, используемые Lollipop?   -  person FoY    schedule 08.12.2014
comment
Вы пытаетесь изменить стиль для API 21+ или вам нужно, чтобы он работал с appcompat?   -  person alanv    schedule 08.12.2014
comment
@alanv Я использую appcompat-v7 21.0   -  person FoY    schedule 09.12.2014
comment
@FoY Ссылка сейчас не работает   -  person Bugs Happen    schedule 30.09.2015


Ответы (3)


Я пытался найти ресурсы, объясняющие, как я могу стилизовать кнопку переключения в теме 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, будет использоваться для окрашивания виджетов в вашем приложении, таких как SwitchCompats, EditTexts, RadioButtons и т. д.

Таким образом, ваш файл 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>

где находятся чертежи, которые я могу использовать для создания собственной версии?

Я бы не рекомендовал изменять чертежи напрямую, но они находятся в

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

person JDJ    schedule 11.12.2014
comment
Я уже пробовал это. На некоторых устройствах SwitchCompat просто исчезает. Я думаю, что это какая-то ошибка, вероятно, такая же, как упомянул Антон. Спасибо, в любом случае. - person FoY; 12.01.2015

Чтобы завершить ответ 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 ничего не надо было

person Anthone    schedule 06.01.2015

В моем случае я хотел стилизовать только определенный переключатель, а не все из них в приложении. Вот как я это сделал с помощью AppCompat-v7:23.

xml макет:

<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/стили.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 — это состояние «выключено», colorAccent — это состояние «включено». Обратите внимание, что ни у одного из них нет префикса пространства имен «android», я не понимаю почему, но это работает только для меня.

person DrewInTheMountains    schedule 10.11.2015
comment
colorSwitchThumbNormal ничего для меня не делает (стоковая прошивка Lollipop) - person Henrique de Sousa; 13.09.2016