AppCompat工具栏:从上部主题

时间:2015-05-14 11:01:08

标签: android android-appcompat material-design android-theme android-toolbar

我有一个" light"主题应用程序:

<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预览不显示标题的白色,它适用于设备):< / p>

Regular application of theme

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

Attempt with toolbarStyle

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

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

2 个答案:

答案 0 :(得分: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>

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

答案 1 :(得分: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>

可用于更新操作栏文字颜色,但您可以在工具栏主题中定义它。

希望这有帮助。