4

У меня есть «свет» -themed приложение с:AppCompat Панель инструментов: набор инструментов темы от верхней темы

<style name="Theme.MyTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="colorPrimary">@color/primary</item> 
    <item name="colorPrimaryDark">@color/primary_dark</item> 
    <item name="colorAccent">@color/accent</item> 
    <!-- etc. --> 
</style> 

Я хочу, чтобы мои Toolbar s, чтобы быть темной тематикой, так что я имею установку следующий стиль, так же, как предложил Chris Banes:

<style name="Theme.MyTheme.Toolbar" parent="ThemeOverlay.AppCompat.Dark.ActionBar"> 
    <!-- stuff --> 
</style> 

Затем, добавляя android:theme="@style/Theme.ByodTheme.Toolbar" к моему android.support.v7.widget.Toolbar, все работает, как ожидалось (даже несмотря на то, Android студии предварительного просмотра не показывает белые цвета для заголовка, он работает на устройствах):

Regular application of theme

Теперь, вместо того, чтобы указать android:theme для каждой панели в моем приложении, я хотел бы указать стиль в моей главной теме и забыть о нем. Я попытался toolbarStyle собственности, но похоже, что он не работает должным образом, так как он полностью портит стандартные свойства:

Attempt with toolbarStyle

Я также сделал другие попытки сделать тему Toolbar наследовать от Widget.AppCompat.Toolbar , а также путем изменения titleTextAppearance и subtitleTextAppearance, но тогда невозможно изменить цвет значка переполнения (да, я попытался установить actionOverflowButtonStyle и наследовать этот стиль от Widget.AppCompat.ActionButton.Overflow, без каких-либо успехов в изменении цвета значка переполнения).

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

ответ

2

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

<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    android:background="?attr/colorPrimary" 
    android:theme="?attr/toolbar_theme" 
    /> 

Важная часть есть только android:theme="?attr/toolbar_theme", который ссылается на пользовательский атрибут из текущей темы.

Вам нужно будет объявить этот атрибут где-нибудь, например, так:

<resources> 
    <attr name="toolbar_theme" format="reference" /> 
</resources> 

Затем вы можете определить, что значение, которое вы хотите использовать панель инструментов путем присвоения значения для toolbar_theme в вашей теме. Например, чтобы сделать его использовать Theme.MyTheme.Toolbar вы могли бы определить его следующим образом:

<style name="Theme.MyTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="colorPrimary">@color/primary</item> 
    <item name="colorPrimaryDark">@color/primary_dark</item> 
    <item name="colorAccent">@color/accent</item> 
    <!-- etc. --> 
    <item name="toolbar_theme">@style/Theme.MyTheme.Toolbar</item> 
</style> 

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

0

Если я правильно понял вопрос, вы хотите установить тему своего приложения один раз и применить все стили к всем панелям инструментов в каждом действии/фрагменте.

Если да, то я бы рекомендовал этот подход:

<style name="MyTheme" parent="Theme.AppCompat.NoActionBar"> 
    <item name="android:textColorPrimary">@color/MyColorPrimaryText</item> 
    <item name="android:windowBackground">@color/MyColorWindowBackground</item> 
    <item name="colorPrimary">@color/MyColorPrimary</item> 
    <item name="colorPrimaryDark">@color/MyColorPrimaryDark</item> 
    <item name="colorAccent">@color/MyColorAccent</item> 
    <item name="colorControlNormal">@color/MyColorControlNormal</item> 
    <item name="colorControlHighlight">@color/MyColorControlHighlight</item> 
    <item name="toolbarStyle">@style/MyToolbar</item> 
    <item name="windowActionModeOverlay">true</item> 
    <item name="actionModeBackground">@color/MyColorPrimaryDark</item> 
</style> 

<style name="MyToolbar" parent="Widget.AppCompat.Toolbar"> 
    <item name="android:layout_width">match_parent</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:minHeight">@dimen/MyToolbarMinHeight</item> 
    <item name="android:gravity">center_vertical</item> 
    <item name="android:background">@color/MyColorPrimary</item> 
    <item name="android:elevation" tools:ignore="NewApi">10dp</item> 
    <item name="theme">@style/MyToolbarTheme</item> 
</style> 

<style name="MyToolbarTheme" parent="ThemeOverlay.AppCompat.ActionBar"> 
    <item name="android:textColorPrimary">@color/MyColorPrimaryText</item> 
    <item name="colorControlNormal">@color/MyToolbarColorControlNormal</item> 
    <item name="colorControlHighlight">@color/MyToolbarColorControlHighlight</item> 
</style> 

Тогда в манифесте:

<application 
    android:name=".MyApp" 
    android:theme="@style/MyTheme"> 
    <activity android:name=".MyActivity1"/> 
    <activity android:name=".MyActivity2"/> 
</application> 

Затем в вашей деятельности компоновочных файлов, включают в себя панель инструментов с:

style="?attr/toolbarStyle" 

Итак, файл макета myActivity1.xml будет выглядеть так:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.Toolbar 
    android:id="@+id/appBar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    style="?attr/toolbarStyle" /> 

<!-- ETC. --> 

</LinearLayout> 

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

<item name="colorControlNormal">@color/MyColorControlNormal</item> 
<item name="colorControlHighlight">@color/MyColorControlHighlight</item> 

И:

<item name="android:textColorPrimary">@color/MyColorPrimaryText</item> 

Может использоваться для обновления текста ActionBar цвета, но вы бы определили его в теме панели инструментов.

Надеюсь, это поможет.

Смежные вопросы