android - AppCompat 工具栏 : set toolbar theme from upper theme

标签 android android-appcompat material-design android-theme 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>

我希望我的 Toolbar 是深色主题的,所以我设置了以下样式,正如 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 预览不显示标题的白色,它适用于设备):

Regular application of theme

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

Attempt with toolbarStyle

我还做了其他尝试,使工具栏主题继承自 Widget.AppCompat.Toolbar,并更改 titleTextAppearancesubtitleTextAppearance,但是似乎无法更改溢出图标的颜色(是的,我尝试设置 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>

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

关于android - AppCompat 工具栏 : set toolbar theme from upper theme,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30235673/

相关文章:

android - 如何在 Android 中以编程方式创建联系人组?

android - 日/夜主题在 android 中未正确实现

javascript - 如何激活Material Design JS?

android - 在启用触摸模式的情况下显示 snackbar 时,无法将焦点放在 snackbar 中的操作按钮上

android - 带有 Appcompat 的 float 工具栏

android - 如何为按钮使用波纹效果

java.lang.NoSuchMethodError : No static method combineMeasuredStates(II)I in class 错误

java - 适用于 Android 的 SSH Java 库?

android - 有 2 个可以依次展开/折叠的 CollapsingToolbarLayout

android - AppCompat ProgressBar 高度