android – 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>

我希望我的工具栏是黑暗的主题,所以我设置了以下样式,就像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 Studio预览不显示标题的白色,它适用于设备):

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

我还做了其他尝试,让工具栏主题继承自Widget.AppCompat.Toolbar,并通过更改titleTextAppearance和subtitleTextAppearance,但是看起来无法更改溢出图标颜色(是的,我试图设置actionOverflowButtonStyle并继承该样式来自Widget.AppCompat.ActionButton.Overflow,没有成功更改溢出图标颜色).

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

最佳答案 您可以使用自定义属性 – 基本上只需将工具栏设置为使用您将在主题中定义的自定义值.

<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>

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

点赞