Android studio use switchcompat from appcompat or switchmaterial from material library

Switch

Switch — ещё один вид переключателей, который появился в Android 4.0 (API 14). Находится в разделах Commons и Buttons. Фактически, это замена немного устаревшего ToggleButton. В новых проектах лучше использовать Switch.

Компонент используется в том случае, когда нужно переключиться на противоположное состояние — да/нет, вкл./выкл., открыть/закрыть. В реальной жизни это выглядит следующим образом.

При добавлении компонента в макет студия рекомендует использовать использовать SwitchCompat или SwitchMaterial. Общий принцип работы у них одинаковый, отличия касаются дизайна.

Компонент представляет собой полоску с двумя состояниями и сопровождающим текстом. Переключиться можно сдвиганием ползунка или касанием экрана в области компонента (не только на самом ползунке, но и на сопровождающем тексте).

По умолчанию компонент находится в выключенном состоянии. Чтобы установить его в включённом состоянии на этапе разработки, используйте атрибут android:checked=»true».

Сопровождающий текст задаётся в атрибуте android:text. А текст на самом переключателе задаётся при помощи атрибутов android:textOn (методы getTextOn() и setTextOn()) и android:textOff (методы getTextOff() и setTextOff()). Обратите внимание, что сопровождающий текст может быть очень большим и положение самого переключателя относительно этого текста можно регулировать при помощи атрибута android:gravity (смотри пример ниже). Если сопровождающий текст вам не нужен, то не используйте атрибут android:text.

Момент переключения можно отслеживать при помощи слушателя CompoundButton.OnCheckedChangeListener.

SwitchCompat

Студия рекомендует использовать SwitchCompat. Явных отличий у него нет.

Для показа текста на кнопке переключателя установите в true значение атрибута app:showText.

Не забывайте, что данный компонент можно использовать только в активностях типа AppCompatActivity.

Вы можете задать свой стиль для SwitchCompat, добавив строки в styles.xml

Цвет дорожки, вдоль которой двигается ползунок, можно поменять также через стиль:

Источник

Предупреждение: используйте SwitchCompat из AppCompat или SwitchMaterial из библиотеки материалов

В чем разница между этими двумя объектами ( SwitchCompat и SwitchMaterial )? Я их пробовал, и визуально они идентичны.

Кстати, а почему удалили класс Switch ? Вы знаете, какой элемент пользовательского интерфейса должен заменить его в будущем?

2 ответа

  • предоставляется Библиотекой компонентов материала
  • расширяет SwitchCompat
  • использует Widget.MaterialComponents.CompoundButton.Switch в качестве стиля по умолчанию, используя цвета, определенные в Theme.MaterialComponents (например, colorSecondary , colorSurface и colorOnSurface ) и применяя Elevation Overlays в темном режиме.

SwitchCompat :

  • предоставляется библиотекой androidx appcompat
  • использует Widget.AppCompat.CompoundButton.Switch как стиль по умолчанию

Кстати, а зачем удалили класс Switch?

Класс Switch не является удален . Он предоставляется платформой Android, как и другие виджеты, такие как Button , TextView . а библиотеки компонентов appcompat и материалов предоставляют их обновленную версию (например, AppCompatButton , MaterialButton . ) .

С этими виджетами все по-другому. Используя тему AppCompat , есть <> , который автоматически заменяет все случаи использования основных виджетов Android, созданных из файлов макета, на расширения AppCompat этих виджетов (например, Button заменяется на AppCompatButton ).
Используя Theme.MaterialComponents , есть < > , который заменяет некоторые виджеты фреймворка на виджеты компонентов материала во время расширения, при условии, что используется тема компонентов материала (например, Button заменяется на MaterialButton ) .

Читайте также:  Что значит значок андроид с восклицательным знаком

Это НЕправильно для SwitchMaterial и SwitchCompat . Причина в том, что AppCompat SwitchCompat фактически не выходит за пределы платформы <> класс.

SwitchCompat — это расширенная версия CompoundButton . SwitchCompat — это версия старого виджета Switch , который на устройствах вернулся к API v7 . Он не пытается использовать виджет, предоставляемый платформой, на тех устройствах, на которых он обычно доступен.

Это расширенная версия SwitchCompat . Создает Material Themed Switch . Этот класс использует атрибуты из темы материала для стилизации Switch . Поскольку SwitchCompat не расширяет Switch , вы должны явно объявить SwitchMaterial в XML макета.

Источник

Темы и стили в Android без магии. И как их готовить с SwitchCompat

В предыдущей статье мы рассмотрели как использовать темы и стили на уровне кода, на примере кастомной view. В этой статье давайте разберем несколько способов стилизации стандартного ui элемента, а в частности SwitchCompat.

Содержание

Введение

Не всегда оформление по умолчанию стандартного UI элемента устраивает дизайнера. Давайте разберем, как поменять внешний вид элемента на примере SwitchCompat.

Для решения задачи нам нужно:

  • Создать свой стиль для SwitchCompat.
  • Каким-то образом задать этот стиль SwitchCompat.

Назначить стиль SwitchCompat можно несколькими способами, например:

  • Указывать для каждой view в верстке экранов через атрибут style.
  • Создать тему с переопределенным атрибутом switchStyle и назначить эту тему в манифесте для всего приложения или конкретной активити. Это изменит внешний вид view для всего приложения/активити.
  • Тему также можно установить программно, в коде активити. При необходимости ее можно менять «на лету».

Новый стиль для SwitchCompat

В ресурсах создадим новый стиль MySwitchStyle, наследуем оформление от Widget.AppCompat.CompoundButton.Switch, задав parent. Можно и не наследовать, но тогда придется указать все значения, даже которые мы не планируем менять.

Чтобы что-то изменить, надо переопределить требуемые атрибуты. Атрибуты можно посмотреть в документации.

В документации видим несколько атрибутов. Они указаны в виде, как если бы мы обращались к ним в коде (например, вот так R.styleable.SwitchCompat_android_thumb). Я расшифрую только часть из них, чтобы не было сомнений. Назначение остальных несложно понять из документации.

В коде В xml
SwitchCompat_android_thumb android:thumb
SwitchCompat_thumbTint thumbTint
SwitchCompat_track track
SwitchCompat_trackTint trackTint
  • android:thumb — ресурс для подвижной части SwitchCompat
  • track — ресурс для неподвижной части SwitchCompat
  • thumbTint — позволяет окрашивать подвижную часть в нужные цвета в зависимости от состояния SwitchCompat
  • trackTint — позволяет окрашивать неподвижную часть в нужные цвета в зависимости от состояния SwitchCompat

В качестве примера изменим цвет thumb (кружочка) — пусть во включенном состоянии он будет оранжевым, в выключенном — зеленым. Некрасиво, но наглядно.

Нам понадобится селектор в папке color наших ресурсов. Файл selector_switch_thumb.xml

Теперь зададим атрибут thumbTint в нашем стиле.

Теперь все SwitchCompat, получившие каким-то образом стиль MySwitchStyle, будут выглядеть по-новому.

Стиль в верстке

Самый тривиальный и негибкий способ.

  • Стиль применяется при inflate ресурса layout.
  • Повлиять программно мы никак не можем.
  • Указывать каждый раз в верстке неудобно. И можем забыть.

Стиль в теме. Тема назначается через Manifest

Создаем тему AppTheme и задаем значение атрибуту switchStyle. Значением является наш стиль MySwitchStyle.

Тема может быть указана в манифесте для всего приложения

Читайте также:  Android java json array

Или для конкретной активити

Теперь все SwitchCompat будут иметь новый внешний вид. Без изменения в верстке.

  • Плюсы — Можем менять внешний вид для всего приложения сразу.
  • Минусы — налету менять не получится.

Стиль в теме. Тема назначается программно

Для того, чтобы установить тему для активити программно, нужно вызвать метод активити setTheme(themeResId).

Давайте менять тему активити в зависимости от состояния Switch.

  1. Устанавливаем тему программно, вызвав setTheme. Метод надо вызывать до super.onCreate(savedInstanceState). В onCreate у нас происходит инициализация фрагментов (когда они есть).
  2. Задаем начальное состояние Switch в зависимости от темы.
  3. Устанавливаем листенер, который при изменении Switch меняет тему в настройках и перезапускает активити через метод активити recreate().

Результат

Другие View

Чтобы переопределить стиль для SwitсhView для всего приложения, мы переопределили значение атрибута switchStyle, можно догадаться, что такие атрибуты есть и для других View.

  • editTextStyle
  • checkboxStyle
  • radioButtonStyle

Как их искать? Я просто смотрю исходники, через Android Studio.
Заходим в тему, зажимаем ctrl, кликаем на родителе нашей темы. Смотрим, как описывают тему ребята из Google. Смотрим, какой атрибут определяется и от какого стиля можно отнаследоваться. Пользуемся.

Кусок из темы Base.V7.Theme.AppCompat.Light.

Ресурсы

Статья не претендует на полный справочник. Код умышленно сокращен. Я ставил задачу дать общее понимание — как это работает и зачем это нужно. Дальше все легко ищется в документации и в стандартных ресурсах.

Источник

[SwitchMaterial] Replace SwitchCompat with SwitchMaterial #1555

Comments

lupajz commented Jul 31, 2020

Is your feature request related to a problem? Please describe.
MaterialComponentsViewInflater doesn’t replace SwitchCompat with SwitchMaterial even though SwitchCompat is declared in XML layout.

Describe the solution you’d like
SwitchCompat to be replaced with SwitchMaterial

Additional context
Or is there reason, that I’m overlooking as why this is not supported ?

The text was updated successfully, but these errors were encountered:

dsn5ft commented Jul 31, 2020

Hi @lupajz, this is because AppCompatViewInflater , which MaterialComponentsViewInflater is built on top of, does not auto-inflate SwitchCompat for the framework Switch . The reason for that is due to the AppCompat SwitchCompat not actually extending from the framework Switch class, so one cannot be replaced with the other.

lupajz commented Jul 31, 2020

Yes @dsn5ft you are right about that. But in AppCompatViewInflater
you would receive a androidx.appcompat.widget.SwitchCompat request that could be transformed in MaterialComponentsViewInflater overriding createView(Context context, String name, AttributeSet attrs) . Would that be a problem ? I see how that diverges from AppCompat which doesn’t replace Switch, since it’s custom implementation of platform one, but on the other hand Material library elements extend from AppCompat ones and this way the usages of SwitchCompat would be replaced by the Material version using LayoutInflater.Factory.

dsn5ft commented Jul 31, 2020

Correct, but we also have a rule not to automatically replace any fully qualified widget paths, like androidx.appcompat.widget.SwitchCompat , with something else, as that could be misleading.

Also, that createView in AppCompatViewInflater is final so I’m not sure we could do it even if we wanted to.

lupajz commented Jul 31, 2020

Didn’t know about that rule, thanks for the info.

I wasn’t refering to the final quilified method, but the one that is called in default branch of that switch statement.

Читайте также:  Геймпад для андроид дефендер

Источник

Android SwitchCompat Example

Being an Android developer I always had a development oriented approach. But once you start exploring things from a learning perspective, discoveries are stupendous. I never realized the full potential of AppCompat library in Android, I always thought; it just increases the size of my APK. Jokes apart, in recent turn of events I stumbled upon a situation where I wanted to use an android switch button in my app, where I should be able to drag that switch to an “On” or an “Off” state. To my dismay even this small task created problems. As a standard Android switch which supports the drag animations is only available from SDK v14 and above. I believe many of you must have faced this issue. This inspired me to write this Android switch button example.

Recently in October 14, an update to AppCompat V7 was released, featuring version 21. This version majorly addressed the material design compatibility issues. But a great feature that missed out the spotlight was the Android SwitchCompat widget. This Android switch button not only acts like a standard android switch which can be dragged by holding, but also works fine in Android API 7 and above if AppCompat v7 r21 is included in your project:

In this example I would show how to make an Android switch button work in all Android API versions above 7.

Android SwitchCompat Example

In Android if you want to use a switch widget, which could be dragged into an “on” or “off” position with animation, you can use Android SwitchCompat widget. This widget can work perfectly with any Android 7+ SDK. It is supported through the AppCompat v7 library, which can be included in a project through gradle if you are using Android Studio or through a library project in Eclipse IDE. Lets have look at the Android SwitchCompat Example below:

Android SwitchCompat example screen would look like the screen shot below:

An interesting feature in SwitchCompat button is that you can write text on its drawable thumb button. In the above XML I have shown two buttons, one with app:showText=»true» and other without it. To use this property you may need to include xmlns:app=»http://schemas.android.com/apk/res-auto» in the parent layout, as shown above. To make this Android switch button detect state change events you may need implement CompoundButton.OnCheckedChangeListener interface in your main activity:

There is not much to explain in the above code. MainActivity simply implements CompoundButton.OnCheckedChangeListener interface to detect the state changes of Android SwitchCompat button. An interesting fact that turned up while I was developing this was that, somehow SwitchCompat does not acknowledges the padding if it is set through the xml. To set padding in an Android SwitchCompat widget you may need to do it through code, as shown above.

Hope with this Android switch button example, I would see more apps in market where a switch button can be dragged. Connect with us through Facebook, Google+, and Twitter for more Android news.

About Mohit Gupt

An android enthusiast, and an iPhone user with a keen interest in development of innovative applications.

Источник

Оцените статью