2014-10-22 29 views
85

我试图用新的支持库工具栏重新创建Theme.AppCompat.Light.DarkActionBar的外观。我如何设计appcompat-v7工具栏,如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的主题。我花了几个小时尝试混合黑暗(基本)主题和灯光主题的不同组合,但我无法找到能够让我拥有浅色背景的组合除了工具栏之外的所有内容。

有没有办法让AppCompat.Light.DarkActionBar外观与导入android.support.v7.widget.Toolbar的?

回答

190

的推荐方式样式工具栏的Light.DarkActionBar克隆是使用Theme.AppCompat.Light.DarkActionbar父/应用的主题,并添加下列属性的风格隐藏默认的动作条:

<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.LightAppBarLayout->android:theme和替代者。另外请注意,如果您已将其设置为主要样式,则这会拾取您的?attr/colorPrimary,因此您可能会获得不同的背景色。

您会发现一个很好的例子就是当前的项目模板,其中包含Android Studio(1.4+)的Empty Activity

+1

嗯是的您可以。 “如果您想继承自己定义的样式,则不必使用父属性,而只需将要继承的样式的名称作为新样式的名称的前缀,并用句点分隔“。 http://developer.android.com/guide/topics/ui/themes.html#Inheritance – Liminal 2014-10-22 09:22:03

+0

谢谢,不知道。不过,我的答案的其余部分应该解决你的问题。 – oRRs 2014-10-22 09:32:20

+1

也使用您发布的XML我得到一个白色的工具栏与白色文本,或者如果我将主题更改为'ThemeOverlay.AppCompat.ActionBar'我得到与黑色文本的白色工具栏,所以它似乎并没有很好的工作。看起来系统似乎并不关心'Base item.meOverlay.AppCompat.Dark'中的 @ color/background_material_dark'。但我会继续挖掘。 (而且我已经看过那个页面,这是我的一个出发点,但似乎仍然没有成功。) – Liminal 2014-10-22 09:35:45

5

Yout可以试试下面。

<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

是。对于那些我可以获得的背景颜色,我终于想出了如何获得标题颜色的权利。然而,现在杀手的东西是,我无法弄清楚溢出按钮的颜色在哪里。无论我改变它如何保持如此黑暗,它不会显示在我黑暗的操作栏上。如果我将主题改变为黑色,那么它很亮并且显示效果很好。不过,无论我多么深入地挖掘,我都无法弄清楚如何在我开始使用轻量级主题时使溢出图标显示亮起。 – Liminal 2014-10-22 09:17:10

27

好吧,沉迷于这个问题的时间已经很长时间了,这是我设法得到我期待的外观的方式。我将它作为一个单独的答案,这样我就可以将所有东西都放在一个地方。

这是一个综合因素。

首先,不要试图让工具栏在主题中表现出色。这似乎是不可能的。

所以明确应用的主题,你的工具栏就像oRRs answer

布局/ 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属性,在工具栏的主题

值/ 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" /> 

和你很好去。

希望这可以帮助别人,所以你不必像我这样花费尽可能多的时间。

(如果有人能想出如何只用主题来完成这项工作,即不具有明确应用主题布局文件,我会很乐意支持,而不是他们的答案)

编辑:

所以显然张贴更完整的答案是downvote磁铁,所以我只接受上述不完整的答案,但在这里留下这个答案,以防有人真正需要它。 如果它让你快乐,随时保持downvoting。

+2

在我AppTheme我只是把 '<项目名称= “colorPrimary”> @色/ colorPrimary' 然后我可以自由地使用 '安卓背景='属性在我的工具栏小工具 “ATTR/colorPrimary?” 。 – lemuel 2015-02-09 07:56:07

+0

我可以知道你如何获得“@ color/material_grey_200”的定义? – 2015-05-16 19:51:23

+0

我不记得确切的位置,但有人根据http://www.google.com/design/spec/style/color.html#color-color-palette制作了colors.xml文件,但现在找不到它 – Liminal 2015-05-18 07:38:54

68

编辑: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> 

注:更新到程序兼容性-V7后,这意味着我使用该框架提供一个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's blog的报价。

With the new Toolbar you can apply a style and a theme. They are different! The style is local to the Toolbar view, for example the background color. The app:theme is instead global to all ui elements inflated in the Toolbar, for example the color of the title and icons.

+0

这应该是被接受的答案。 – JDJ 2014-12-02 15:05:18

+0

“错误:找不到与给定名称匹配的资源:attr'colorPrimary'。”我们在这里讨论使用appcompat_v7。 – Yar 2015-03-19 13:24:42

+0

@Yar是代码使用apoopcompat v7 – LordRaydenMK 2015-03-19 19:39:33

14

我发现这样做的最彻底的方法是创建“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"/> 
+3

我的上帝,这是它! textColorPrimary!为什么这么难找到任何地方 – Muppet 2016-01-23 20:47:47

1

类似Arnav饶的,但有一个不同的父:

<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'是'android.widget.Toolbar'的API 21+。 'toolbarStyle'是'android.support.v7.widget.Toolbar'的AppCompat。 – 2017-10-15 19:12:21

+0

我曾以为Android Studio给了我一个问题,但在第二次测试中,你是对的!这是一个好消息 - 我已经能够将我的minSDK再次降低到19,并且它看起来像我的toolbarStyle仍然工作正常!谢谢! – craigmj 2017-10-15 19:23:21

+0

刚刚注意!仍然存在对*风格*与*主题*的误解。 'MyToolbar'风格应该扩展'Widget.AppCompat.Toolbar'不是一个主题。 – 2017-10-15 19:38:30

3

要自定义工具栏样式,首先创建继承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>