Освой Android играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Делаем панель навигации прозрачной (API 19+)
<style name="AppTheme" parent="Theme.AppCompat">
<item name="android:windowTranslucentNavigation">true</item>
</style>
По умолчанию панель навигации с кнопками "Назад", "Домой" и "Недавние программы" имеет чёрный цвет. Переопределяем (API 21+).
<style name="AppTheme" parent="Theme.AppCompat">
<item name="android:navigationBarColor">@color/my_color</item>
</style>
Можно поменять на Android 5 (Lollipop).
<item name="android:statusBarColor" tools:targetApi="lollipop">@color/teal_700</item>
Позже (API 21+) можно уже не указывать targetApi.
<item name="android:statusBarColor">@color/statusBarColour</item>
Делаем строку состояния прозрачной (API 19+).
<style name="AppTheme" parent="Theme.AppCompat">
<item name="android:windowTranslucentStatus">true</item>
</style>
Меняем цвет строку состояния на белый (API 23+).
<style name="AppTheme" parent="Theme.AppCompat">
<item name="android:windowLightStatusBar">true</item>
</style>
Программный способ (API 21++).
val window = window
window.statusBarColor = ContextCompat.getColor(this, R.color.teal_200)
Переопределяем внешний вид стандартного значка меню в виде трёх точек по вертикальной линии.
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="android:actionOverflowButtonStyle">@style/MyActionButtonOverflow</item>
</style>
<!-- Стиль для замены значка меню в ActionBar. Установите 'android:actionOverflowButtonStyle' в AppTheme -->
<style name="MyActionButtonOverflow" parent="android:style/Widget.Holo.Light.ActionButton.Overflow">
<item name="android:src">@mipmap/ic_launcher</item>
</style>
Читатели сообщили, что код может не работать и дали ссылку на работающий вариант:
You can use this style (or Theme.AppCompat.Light.NoActionBar):
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="actionOverflowButtonStyle">@style/OverFlow</item>
</style>
<style name="OverFlow" parent="Widget.AppCompat.ActionButton.Overflow">
<item name="android:src">@drawable/ic_myoverflow</item>
</style>
Обычная кнопка по умолчанию использует стиль buttonStyle, который можно не указывать.
<Button
...
style="?android:attr/buttonStyle"/>
На панели Palette можно увидеть кнопку меньшего размера Small Button, который на экране будет выглядеть чуть меньше стандартной кнопки с уменьшенным шрифтом. Разница заключается в стиле buttonStyleSmall.
<Button
...
style="?android:attr/buttonStyleSmall"/>
Также возможны другие стили. Например, кнопка без окантовки (плоская кнопка) - стиль borderlessButtonStyle. Она покажет свои границы в момент нажатия.
<Button
...
style="?android:attr/borderlessButtonStyle"/>
Переопределяем через собственные стили и подключаем через android:theme.
<style name="PrimaryFlatButton" parent="Theme.AppCompat.Light">
<item name="android:buttonStyle">@style/Widget.AppCompat.Button.Borderless.Colored</item>
<item name="colorControlHighlight">@color/colorAccent</item>
<item name="colorAccent">@color/colorPrimary</item>
</style>
Ещё один стиль, попадавший мне в примерах - buttonStyleInset.
<Button
...
style="?android:attr/buttonStyleInset"/>
Можно применить стиль Material Design:
<Button
...
style="@android:style/Widget.Material.Button.Colored"/>
У кнопки ToggleButton есть свой стиль buttonStyleToggle:
<ToggleButton
...
style="?android:attr/buttonStyleToggle"/>
В Material Design буквы в кнопках и метках выводятся в верхнем регистре. Можно отменить это правило, если добавить строку в используемой теме.
<item name="android:textAllCaps">false</item>
Или более тонкая настройка для кнопки.
<style name="AppTheme" parent="AppBaseTheme">
<item name="android:buttonStyle">@style/Button</item>
</style>
<style name="Button" parent="Widget.AppCompat.Button">
<item name="android:textAllCaps">false</item>
</style>
У компонентов в стиле Material Design при нажатии появляется анимация в виде расходящего круга (ripple). Стиль selectableItemBackgroundBorderless применим к различным компонентам: кнопки, рамки и т.д. Применим к ImageView. В первом случае анимация не распространяется за пределы своего компонента. Во втором случае анимация выходит за пределы границ компонента.
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:src="@mipmap/ic_launcher"/>
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:src="@mipmap/ic_launcher"/>
Стоит отметить, что существует упрощённый стиль selectableItemBackground, доступный для старых устройств. В этом случае анимация уже не виде круга, а в более простом варианте. Для первой кнопки в виде прямоугольника внутри своего контейнера. Во втором случае анимация также не выходит за границы своего контейнера.
Для примера Android: Шаблон Navigation Drawer Activity
Можно поменять цвет значка гамбургера. Откроем файл стилей res/values/styles.xml и добавим:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
</style>
<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
<item name="spinBars">true</item>
<item name="color">@android:color/white</item>
</style>
Элемент spinBars со значением true позволяет использовать анимацию. В противном случае значок будет статичным.