AppCompat Toolbar:从上层主题设置工具栏主题

fra*_*llo 5 android android-appcompat android-theme material-design android-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. -->
</style>
Run Code Online (Sandbox Code Playgroud)

我希望我的Toolbar主题是深色主题,所以我设置了以下样式,正如Chris Banes的建议:

<style name="Theme.MyTheme.Toolbar" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <!-- stuff -->
</style>
Run Code Online (Sandbox Code Playgroud)

然后,通过添加android:theme="@style/Theme.ByodTheme.Toolbar"到 my android.support.v7.widget.Toolbar,一切都按预期工作(即使 Android Studio 预览不显示标题的白色,它也适用于设备):

主题的常规应用

现在,我不想在应用程序中指定每个工具栏,而是android:theme想在主主题中指定样式,然后忘记它。我已经尝试过该toolbarStyle属性,但看起来它没有按预期工作,因为它完全搞乱了标准属性:

尝试使用toolbarStyle

我还进行了其他尝试,通过使工具栏主题继承Widget.AppCompat.Toolbar,并通过更改titleTextAppearancesubtitleTextAppearance,但看起来不可能更改溢出图标颜色(是的,我尝试设置actionOverflowButtonStyle并继承该样式Widget.AppCompat.ActionButton.Overflow,但没有成功更改溢出图标颜色)。

有没有办法从一个点指定应用程序中每个工具栏的主题?

Lor*_*rte 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"
    />
Run Code Online (Sandbox Code Playgroud)

重要的部分是android:theme="?attr/toolbar_theme"引用当前主题中的自定义属性。

您需要在某处声明此属性,如下所示:

<resources>
    <attr name="toolbar_theme" format="reference" />
</resources>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

使用属性的好处是它可以让您的应用程序具有多个主题,并且单个工具栏资源将使用您在主题中设置的任何值。