Поиск по этому блогу

суббота, 18 октября 2014 г.

Изменить цвет ActionBar, ActionBar.Tabs и ActionBar.PopupMenu

Так бывает складывается что нужно поменять полностью цвет Action bar'a, табов под ним и меню, да и всего на свете. Так вот это оказывается не так то просто (: Я проковырялся дня два пока разобрался со всем этим, и вот сегодня я хочу вам рассказать как да что нужно сделать что бы изменить цвет Action bar'a, табов и popup menu.


Менять мы будем на синий цвет но для начала я хочу вам рассказать о таком замечательном ресурсе который позволяет одним махом заменить все и сразу, он называется Android Action Bar Style Generator, с его помощью вы можете создать нужный вам стиль, и скачать его. После вам остается только распаковать в нужные папки все файлы которые там есть и заменить стиль в манифесте на созданный вами… И все, дальше андроид сам подхватит этот стиль и будет его использовать как дефолтный.

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/MY_SAMPLE_THEME_HERE" >




Ну а теперь перейдем к моему варианту того как я менял цвет. 

Для начала создадим файл res/values/color.xml в котором будем хранить все нужные нам коды цветов.

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <color name="actionbar_color">#314e6e</color>
    <color name="tabs_color">#2a4562</color>
    <color name="item_selected">#2a4562</color>

</resources>


ActionBar


Для того что бы изменить цвет Action bar'a, вам нужно создать в файле res/values/style.xml, подгруппу в которой переопределим наш цвет. Для начала посмотрим как выглядит не тронутый style.xml.

<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <!--
        Base application theme, dependent on API level. This theme is replaced
        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
    -->
    <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
        <!--
            Theme customizations available in newer API levels can go in
            res/values-vXX/styles.xml, while customizations related to
            backward-compatibility can go here.
        -->
    </style>

<!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">

    </style>
</resources>


Что тут можно сказать… Ничего (: Так выглядит стандартный стиль темы в андроиде, для того что бы изменить цвет мы добавляем новый стиль:

<style name="ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">
        <item name="android:background">@color/actionbar_color</item>
    </style>


Таким образом мы задаем что фон у экшен бара будет нашего цвета тобиш синего.
Теперь нам нужно задать этот стиль экшен бару по дефолту, для этого в AppTheme пишем следующее:

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:actionBarStyle">@style/ActionBar</item>
</style>


Компилируем и смотрим что получилось, если ActionBar покрасился в выбранный нами цвет то вы все сделали правильно.

Что получилось:


Конечный вид:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    </style>

    <style name="AppTheme" parent="AppBaseTheme">
      <item name="android:actionBarStyle">@style/ActionBar</item>
    </style>
    
    <style name="ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">
        <item name="android:background">@color/actionbar_color</item>
        <item name="android:backgroundStacked">@color/tabs_color</item>
    </style>
</resources>



TabView


Для того что бы подкрасить табы в нужный нам цвет достаточно просто добавить еще одну строчку в стиль ActionBar.

<style name="ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">
        <item name="android:background">@color/actionbar_color</item>
        
        <!-- вот она ниже -->
        <item name="android:backgroundStacked">@color/tabs_color</item>
    </style>


Теперь табы будут того цвета которого вы задали для пол tabs_color в файле colors.xml. 

Что получилось:


Конечный вид:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    </style>

    <style name="AppTheme" parent="AppBaseTheme">
      <item name="android:actionBarStyle">@style/ActionBar</item>
    </style>
    
    <style name="ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">
        <item name="android:background">@color/actionbar_color</item>
        <item name="android:backgroundStacked">@color/tabs_color</item>
    </style>
</resources>


Popup Menu


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

Создаем новый стиль и указываем в нем цвет

<style name="PopupMenu" parent="@android:style/Widget.Holo.ListPopupWindow">
        <item name="android:popupBackground">@color/actionbar_color</item> 
    </style>


Далее описываем его в AppTheme стиле который мы используем как родительский.

<style name="AppTheme" parent="AppBaseTheme">
      <item name="android:actionBarStyle">@style/ActionBar</item>
      <item name="android:popupMenuStyle">@style/PopupMenu</item>
    </style>


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

<style name="Theme.stylingactionbar.widget" parent="@android:style/Theme.Holo">
        <item name="android:popupMenuStyle">@style/PopupMenu</item>
    </style>


Что получилось:


Конечный вид:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    </style>

    <style name="AppTheme" parent="AppBaseTheme">
      <item name="android:actionBarStyle">@style/ActionBar</item>
      <item name="android:popupMenuStyle">@style/PopupMenu</item>
      <item name="android:actionBarWidgetTheme">@style/Theme.stylingactionbar.widget</item>
    </style>
    
    <style name="ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">
        <item name="android:background">@color/actionbar_color</item>
        <item name="android:backgroundStacked">@color/tabs_color</item>
    </style>
    
    <style name="PopupMenu" parent="@android:style/Widget.Holo.ListPopupWindow">
        <item name="android:popupBackground">@color/actionbar_color</item> 
    </style>
    
    <style name="Theme.stylingactionbar.widget" parent="@android:style/Theme.Holo">
        <item name="android:popupMenuStyle">@style/PopupMenu</item>
    </style>
</resources>


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