如何设置Appcompat-v7工具栏(如Theme.AppCompat.Light.DarkActionBar)的样式?


105

我正在尝试Theme.AppCompat.Light.DarkActionBar使用新的支持库工具栏重新创建外观。

如果我选择Theme.AppCompat.Light我的工具栏将是浅的,如果我选择Theme.AppCompat它将是黑暗的。(从技术上讲,您必须使用该.NoActionBar版本,但据我所知,唯一的区别是

<style name="Theme.AppCompat.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="android:windowNoTitle">true</item>
</style>

现在没有了,Theme.AppCompat.Light.DarkActionBar但我天真地以为自己做一个就足够了

<style name="Theme.AppCompat.Light.DarkActionBar.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="android:windowNoTitle">true</item>
</style>

但是与此有关,我的工具栏仍然是Light主题。我已经花了几个小时尝试混合Dark(基本)主题和Light主题的不同组合,但是我找不到一个可以使除工具栏之外的所有背景都具有浅色背景的组合。

有没有办法让AppCompat.Light.DarkActionBar外观与import android.support.v7.widget.Toolbar的一样?

Answers:


216

建议为Light.DarkActionBar克隆的工具栏设置样式的推荐方法是Theme.AppCompat.Light.DarkActionbar用作父/应用程序主题,并在样式中添加以下属性以隐藏默认的ActionBar:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

然后将以下内容用作您的工具栏:

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.AppBarLayout>

对于进一步的修改,你会创建样式扩展ThemeOverlay.AppCompat.Dark.ActionBarThemeOverlay.AppCompat.Light内更换者AppBarLayout->android:themeToolbar->app:popupTheme。还要注意,?attr/colorPrimary如果您将其设置为主要样式,它将使您更加满意,因此您可能会获得不同的背景色。

您可以在带有Empty ActivityAndroid Studio(1.4+)的当前项目模板中找到一个很好的例子。


1
好吧,你可以。“如果要继承自定义的样式,则不必使用parent属性。相反,只需将要继承的样式名称前缀为新样式的名称,并用句点分隔。” developer.android.com/guide/topics/ui/themes.html#Inheritance
Liminal 2014年

1
同样使用您发布的xml,我会得到一个带有白色文本的白色工具栏,或者如果我将主题更改为ThemeOverlay.AppCompat.ActionBar我得到了带有黑色文本的白色工具栏,那么它似乎不能很好地工作。好像系统不在乎<item name="android:colorBackground">@color/background_material_dark</item>in Base.ThemeOverlay.AppCompat.Dark。但我会继续挖掘。(而且我已经读过该页面。那是我的出发点之一。似乎还是行不通的。)
Liminal 2014年

1
对于那个很抱歉。为了简单起见,省略了工具栏的背景色,并且尚未测试结果。我已经相应地修改了答案。我还没有找到一种仅使用样式的方法。由于我的应用程序具有不同的配色方案,因此我android:background="?attr/colorPrimary"在工具栏中使用了<item name="colorPrimary">@color/background_material_dark</item>自己的样式,因此它会自动适应主应用程序的颜色。
oRRs 2014年

1
这在App Compat 23中不再起作用,标题是黑色而不是白色:/
Rashad.Z 2015年

21
有什么办法可以控制这个主题和风格的丛林?
axd

72

编辑:更新到appcompat-v7:22.1.1并使用AppCompatActivity代替ActionBarActivity我的styles.xml后,看起来像:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>

注意:这意味着我正在使用Toolbar框架提供的(XML文件中未包含)。

这对我
有用:styles.xml文件:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>

更新:Gabriele Mariotti博客的报价。

使用新的工具栏,您可以应用样式和主题。它们不一样!样式是工具栏视图的局部样式,例如背景色。相反,app:theme对于工具栏中所有ui元素都是全局的,例如标题和图标的颜色。


“错误:找不到与给定名称匹配的资源:attr'colorPrimary'。” 我们在这里谈论使用appcompat_v7。
2015年

对我来说,这仅适用于棒棒糖设备。在棒棒糖上,不仅动作栏,而且所有活动都使用深色主题,这不是我想要的。我投票赞成,但最后我使用了oRRs答案,对单个工具栏视图进行了样式设置。
lorenzo-s 2015年

@ lorenzo-s我更新了最新版本的appcompat的答案。我也在带Android 4.3的Galaxy Nexus上进行了测试,并且可以正常工作
LordRaydenMK,2015年

31

在花了很多时间解决这个问题后,这是我设法获得希望的外观的方式。我将其作为一个单独的答案,这样我可以将所有内容集中在一个地方。

这是多种因素的组合。

首先,不要试图让工具栏仅通过主题就可以很好地播放。似乎不可能。

因此,像在oRRs答案中一样,将主题明确地应用于您的工具栏

布局/toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_alignParentTop="true"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:theme="@style/Dark.Overlay"
    app:popupTheme="@style/Dark.Overlay.LightPopup" />

但这是神奇的调味料。为了真正获得背景色,我希望您必须覆盖background工具栏主题中的属性

values / styles.xml:

<!-- 
    I expected android:colorBackground to be what I was looking for but
    it seems you have to override android:background
-->
<style name="Dark.Overlay" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:background">?attr/colorPrimary</item>
</style>

<style name="Dark.Overlay.LightPopup" parent="ThemeOverlay.AppCompat.Light">
    <item name="android:background">@color/material_grey_200</item>
</style>

然后将您的工具栏布局包括在其他布局中

<include android:id="@+id/mytoolbar" layout="@layout/toolbar" />

而且你很好。

希望这对其他人有帮助,这样您就不必像我一样花很多时间了。

(如果有人能弄清楚如何仅使用主题来完成这项工作,即不必在布局文件中显式应用主题,那么我会很乐意支持他们的回答)

编辑:

因此,发布一个更完整的答案显然是不明智的选择,所以我只接受上述不完整的答案,但在此保留此答案,以防有人真正需要它。如果让您满意的话,请随时继续投票。


2
在我的AppTheme我只是把<item name="colorPrimary">@color/colorPrimary</item> 那么我可以自由地使用android:background="?attr/colorPrimary"在我的工具栏属性窗口小部件。
lemuel

我可以知道如何获得“ @ color / material_grey_200”的定义吗?
Cheok Yan Cheng

我不记得确切的位置了,但是有人根据google.com/design/spec/style/color.html#color-color-palette制作了colors.xml文件, 但是现在找不到了
2015年

1
@Liminal如果您使用@android:color/transparent它可以避免在长按/单击菜单项时出现问题,那么文本周围会出现一个框。如果将来浅色背景颜色发生变化,这也可以为将来提供证明。
Ryan R

但是,当您使用CollapsingToolbarLayout时不起作用。
arekolek

17

我发现做到这一点的最干净的方法是创建' ThemeOverlay.AppCompat.Dark.ActionBar ' 的子。在示例中,我将工具栏的背景色设置为红色,文本的颜色设置为蓝色。

<style name="MyToolbar" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:background">#FF0000</item>
    <item name="android:textColorPrimary">#0000FF</item>
</style>

然后,您可以将主题应用于工具栏:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    app:theme="@style/MyToolbar"
    android:minHeight="?attr/actionBarSize"/>

6
天哪,就是这样!textColorPrimary!为什么这么难以置信的地方
Muppet

12

要自定义工具栏样式,首先要创建工具栏自定义样式继承Widget.AppCompat.Toolbar,覆盖的属性,然后,如下所示添加到自定义应用程序的主题,请参阅http://www.zoftino.com/android-toolbar-tutorial为更多信息工具栏和样式。

   <style name="MyAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="toolbarStyle">@style/MyToolBarStyle</item>
    </style>
    <style name="MyToolBarStyle" parent="Widget.AppCompat.Toolbar">
        <item name="android:background">#80deea</item>
        <item name="titleTextAppearance">@style/MyTitleTextAppearance</item>
        <item name="subtitleTextAppearance">@style/MySubTitleTextAppearance</item>
    </style>
    <style name="MyTitleTextAppearance" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
        <item name="android:textSize">35dp</item>
        <item name="android:textColor">#ff3d00</item>
    </style>
    <style name="MySubTitleTextAppearance" parent="TextAppearance.Widget.AppCompat.Toolbar.Subtitle">
        <item name="android:textSize">30dp</item>
        <item name="android:textColor">#1976d2</item>
    </style>

7

您可以在下面尝试。

<style name="MyToolbar" parent="Widget.AppCompat.Toolbar">
    <!-- your code here -->
</style>

您可以在https://developer.android.com/reference/android/support/v7/appcompat/R.styleable.html#Toolbar中找到详细元素

这里有更多一些:TextAppearance.Widget.AppCompat.Toolbar.TitleTextAppearance.Widget.AppCompat.Toolbar.SubtitleWidget.AppCompat.Toolbar.Button.Navigation

希望这可以帮到你。


1
对。有了这些,我就可以尽可能正确地设置背景颜色,最后我找到了如何正确设置标题颜色的方法。但是,目前的杀手thing是我无法弄清楚溢出按钮从何处获得其颜色。无论我如何更改,它都保持黑暗状态,不会在我的黑暗操作栏上显示。如果我将主题更改为黑暗,则它会很亮并且可以很好地显示。但是,无论我挖了多少东西,当我开始使用明亮的主题
Liminal

0

与Arnav Rao相似,但父代不同:

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>

    <item name="toolbarStyle">@style/MyToolbar</item>
</style>

<style name="MyToolbar" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:background">#ff0000</item>
</style>

通过这种方法,工具栏的外观完全由应用程序样式定义,因此您无需在每个工具栏上放置任何样式。


2
实际上android:toolbarStyle是的API 21+ android.widget.ToolbartoolbarStyle是AppCompat的android.support.v7.widget.Toolbar
Eugen Pechanec

我以为Android Studio会给我一个问题,但是在第二次测试中,您是对的!这真是个好消息-我已经能够再次将minSDK降低到19,看来我的toolbarStyle仍然可以正常工作!谢谢!
craigmj

刚注意到!样式主题之间仍然存在误解。MyToolbar样式不应扩展Widget.AppCompat.Toolbar主题。
Eugen Pechanec
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.