Статьи

Android с нуля: создание стилей и тем

Как разработчики Android, мы стремимся сосредоточиться в первую очередь на функциональности наших приложений. Однако одной лишь функциональности достаточно редко. В Google Play, на котором сегодня размещено более миллиона приложений, внешний вид не менее важен, чем функциональность. Если вам трудно в это поверить, я советую вам взглянуть на приложения в разделе « Лучшие графики » в Google Play.

Существует два подхода к изменению внешнего вида приложений Android. Первый подход предполагает непосредственное изменение свойств представлений в XML-файлах макета. Такой подход возможен только в том случае, если вы работаете над простым приложением с небольшим количеством просмотров и действий. Второй подход предполагает создание и использование пользовательских стилей и тем. Если вы знакомы с веб-разработкой, первый подход похож на использование встроенных стилей CSS, а второй — на использование таблиц стилей.

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

Стили, очевидно, применяются к компонентам пользовательского интерфейса. Поэтому давайте начнем с создания нового пустого действия и добавления двух представлений в его XML-файл макета.

01
02
03
04
05
06
07
08
09
10
11
<View android:layout_width=»100dp»
    android:layout_height=»100dp»
    android:layout_margin=»5dp»
    android:background=»#009688″
    android:id=»@+id/box1″ />
 
<View android:layout_width=»100dp»
    android:layout_height=»100dp»
    android:background=»#00BCD4″
    android:layout_margin=»5dp»
    android:id=»@+id/box2″ />

Как видно из приведенного выше кода, такие свойства, как layout_width и layout_margin , явно включены в определение каждого представления.

Чтобы создать новый стиль для первого представления, щелкните его правой кнопкой мыши и выберите « Refactor»> «Extract»> «Style» .

Теперь вы увидите диалоговое окно, в котором вы можете дать имя стилю, а также выбрать атрибуты, которые должны быть включены в него. Пусть имя будет MyBox и выберите все атрибуты, кроме background .

Извлечь стиль

Когда вы нажмете ОК , вы увидите, что код для первого просмотра изменился.

1
2
3
<View android:background=»#009688″
   android:id=»@+id/box1″
   style=»@style/MyBox» />

Теперь у представления есть атрибут style который указывает на стиль MyBox . Вы можете взглянуть на определение стиля, открыв res / values ​​/ styles.xml .

1
2
3
4
5
<style name=»MyBox»>
    <item name=»android:layout_width»>100dp</item>
    <item name=»android:layout_height»>100dp</item>
    <item name=»android:layout_margin»>5dp</item>
</style>

После того, как стиль создан, его можно применить к любому представлению. Например, вот как вы бы применили MyBox ко второму виду:

1
2
3
<View android:background=»#00BCD4″
   android:id=»@+id/box2″
   style=»@style/MyBox» />

С примененными стилями вот как выглядят два представления в упражнении:

Два взгляда со стилями

Android позволяет создавать стили, которые используют другие стили в качестве основы. Другими словами, он позволяет расширять существующие стили.

Существует два разных синтаксиса, которым вы можете следовать при расширении стиля. Первый синтаксис часто называют неявным синтаксисом и использует точечную запись. Например, вот как вы создаете два производных стиля, называемые TEAL и CYAN , используя MyBox в качестве родительского стиля:

1
2
3
4
5
6
7
<style name=»MyBox.TEAL»>
    <item name=»android:background»>#009688</item>
</style>
 
<style name=»MyBox.CYAN»>
    <item name=»android:background»>#00BCD4</item>
</style>

Как вы уже догадались, и MyBox.TEAL и MyBox.CYAN обладают всеми свойствами MyBox . В дополнение к этому у них есть свойство android:background .

Второй синтаксис для создания производного стиля обычно называется явным синтаксисом . Он включает в себя использование parent атрибута, значением которого является имя родительского стиля. Вот фрагмент кода, который определяет стиль под названием TealBox .

1
2
3
<style name=»TealBox» parent=»MyBox»>
    <item name=»android:background»>#009688</item>
</style>

Применение производных стилей ничем не отличается от применения обычных.

1
2
3
4
5
<View android:id=»@+id/box1″
    style=»@style/TealBox» />
 
<View android:id=»@+id/box2″
    style=»@style/MyBox.CYAN» />

Большинство разработчиков используют неявный синтаксис при расширении своих собственных стилей и явный синтаксис при расширении стилей платформы.

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

По умолчанию все приложения, созданные с использованием последней версии Android Studio, используют тему под названием AppTheme . AppTheme является потомком известной темы AppCompat , большой и очень всеобъемлющей темы, которая может повлиять на внешний вид почти всех широко используемых представлений.

Вы можете найти определение AppTheme в styles.xml :

1
2
3
4
5
6
<!— Base application theme.
<style name=»AppTheme» parent=»Theme.AppCompat.Light.DarkActionBar»>
    <item name=»colorPrimary»>@color/colorPrimary</item>
    <item name=»colorPrimaryDark»>@color/colorPrimaryDark</item>
    <item name=»colorAccent»>@color/colorAccent</item>
</style>

AppTheme следует материальному дизайну. Поэтому для создания собственных тем, которые соответствуют спецификации Material Design , использование AppTheme в качестве родителя всегда является хорошей идеей. Кроме того, вы можете напрямую использовать Theme.AppCompat в качестве родителя.

Несмотря на то, что вы всегда можете создавать темы, написав код XML — помните, что это просто стили — в этом учебном пособии я покажу вам, как использовать редактор тем Android Studio, чтобы выполнить всю тяжелую работу за вас.

Чтобы открыть редактор тем, откройте меню « Инструменты» и выберите « Android»> «Редактор тем» .

В правой части окна редактора тем есть элементы управления не только для изменения тем, но и для создания новых. Левая сторона показывает вам предварительный просмотр результатов изменений, которые вы вносите в темы.

Редактор тем

Чтобы создать новую тему, щелкните раскрывающееся меню « Тема» и выберите параметр « Создать новую тему» .

В появившемся диалоговом окне установите имя новой темы на MyTheme и нажмите ОК .

Создать новую тему

На этом этапе у styles.xml будет новая строка, которая выглядит следующим образом:

1
<style name=»MyTheme» parent=»AppTheme» />

Теперь давайте MyTheme с помощью редактора тем. Для простоты в этом руководстве мы будем изменять только значения colorPrimary , colorPrimaryDark и colorAccent .

Чтобы изменить значение colorPrimary , нажмите кнопку colorPrimary . Редактор тем теперь покажет вам диалог, содержащий палитру цветов. Выберите любой цвет, который вы хотите, но убедитесь, что вы даете ему новое имя. Если вы забудете это сделать, редактор тем заменит цвет, используемый AppTheme .

Редактирование цветаPrimary

Выполните те же действия, чтобы изменить значения colorPrimaryDark и colorAccent . Редактор тем автоматически использует цвет, выбранный вами для colorPrimary чтобы предложить подходящие цвета для colorPrimaryDark и colorAccent .

Определение MyTheme теперь будет выглядеть так:

1
2
3
4
5
<style name=»MyTheme» parent=»AppTheme» >
    <item name=»colorPrimary»>@color/colorPrimaryMyTheme</item>
    <item name=»colorPrimaryDark»>@color/colorPrimaryDarkMyTheme</item>
    <item name=»colorAccent»>@color/colorAccentMyTheme</item>
</style>

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

Следующий код создает обычную Button , Button без полей, цветную Button , Seekbar , Button RadioButton , Switch , Seekbar , TextView и EditText .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<Button android:layout_width=»match_parent»
    android:layout_height=»wrap_content»
    android:text=»normal»
    android:id=»@+id/normal_button» />
 
<Button android:layout_width=»match_parent»
    android:layout_height=»wrap_content»
    android:text=»borderless»
    android:id=»@+id/borderless_button»
    style=»@style/Widget.AppCompat.Button.Borderless» />
 
<Button android:layout_width=»match_parent»
    android:layout_height=»wrap_content»
    android:text=»colored»
    android:id=»@+id/colored_button»
    style=»@style/Widget.AppCompat.Button.Colored» />
 
<CheckBox android:layout_width=»match_parent»
    android:layout_height=»wrap_content»
    android:text=»New CheckBox»
    android:id=»@+id/checkBox» />
 
<RadioButton android:layout_width=»match_parent»
    android:layout_height=»wrap_content»
    android:text=»New RadioButton»
    android:id=»@+id/radioButton» />
 
<Switch android:layout_width=»match_parent»
    android:layout_height=»wrap_content»
    android:text=»New Switch»
    android:id=»@+id/switchButton» />
 
<SeekBar android:layout_width=»match_parent»
    android:layout_height=»wrap_content»
    android:id=»@+id/seekBar» />
 
<TextView android:layout_width=»match_parent»
    android:layout_height=»wrap_content»
    android:text=»New Text»
    android:id=»@+id/textView» />
 
<EditText android:layout_width=»match_parent»
    android:layout_height=»wrap_content»
    android:id=»@+id/editText»
    android:hint=»Input» />

Со всеми недавно добавленными видами макет будет выглядеть так:

Макет с использованием AppTheme

Если вы читали спецификацию Material Design, я уверен, что вы можете сказать, что в данный момент в colorPrimary используются цвета индиго для colorPrimary и colorPrimaryDark . Для colorAccent он использует оттенок розового. Это цвета по умолчанию, указанные в Android Studio. Вы можете найти их шестнадцатеричные эквиваленты в res / values ​​/ colors.xml вашего проекта.

Чтобы применить MyTheme , тему, которую мы создали на предыдущем шаге, к вашей деятельности, откройте файл манифеста вашего проекта и добавьте атрибут android:theme в определение действия. Установите его значение @style/MyTheme .

1
2
3
4
5
6
7
<activity android:name=».MainActivity»
    android:theme=»@style/MyTheme»>
    <intent-filter>
        <action android:name=»android.intent.action.MAIN» />
        <category android:name=»android.intent.category.LAUNCHER» />
    </intent-filter>
</activity>

Точно так же вы можете применить тему ко всему вашему приложению, установив значение атрибута android:theme определения приложения в @style/MyTheme .

Если вы посмотрите на свою деятельность сейчас, она должна выглядеть совсем иначе.

Макет с использованием MyTheme

Из этого урока вы узнали, как создавать и применять пользовательские стили и темы для Android. Не стесняйтесь использовать эти знания, чтобы придать вашим приложениям новый и лучший вид. Однако старайтесь не слишком увлекаться — большинство пользователей Android сегодня настолько привыкли к Material Design, что отклонение от его руководящих принципов может раздражать их.

Чтобы узнать больше о стилях и темах, я предлагаю вам ознакомиться с Руководством по стилям и темам .