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

5

我有一个以“轻盈”为主题的应用程序,其中包括:

<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预览不显示标题的白色,但它在设备上起作用):

Regular application of theme

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

Attempt with toolbarStyle

我还尝试了其他方法,例如使Toolbar主题继承自Widget.AppCompat.Toolbar,并更改titleTextAppearancesubtitleTextAppearance,但是这样似乎无法更改溢出图标颜色(是的,我已经尝试设置actionOverflowButtonStyle,并从Widget.AppCompat.ActionButton.Overflow继承该样式,但未能成功更改溢出图标颜色)。
有没有办法从单一点指定我的应用程序中每个工具栏的主题?
2个回答

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>

可以用于更新操作栏文本颜色,但需要在工具栏主题中定义。

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接