如何设置appcompat-v7工具栏的样式,如Theme.AppCompat.Light.DarkActionBar?

时间:2014-10-22 08:25:01

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

我正在尝试使用新的支持库工具栏重新创建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外观?

7 个答案:

答案 0 :(得分:207)

Light.DarkActionBar克隆设置工具栏样式的推荐方法是使用Theme.AppCompat.Light.DarkActionbar作为父/ app主题,并将以下属性添加到样式以隐藏默认的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 Activity Android Studio(1.4 +)。

答案 1 :(得分:70)

编辑:更新到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's blog的报价。

  

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

答案 2 :(得分:31)

好的经历了很长时间陷入这个问题,这是我设法得到我希望的外观的方式。我把它作为一个单独的答案,所以我可以把所有东西放在一个地方。

这是一系列因素。

首先,不要试图通过主题让工具栏发挥出色。这似乎是不可能的。

因此,请将主题明确应用于您的工具栏,例如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磁铁所以我会接受上面的不完整的答案,但留下这个答案,以防有人真正需要它。 如果让你开心的话,请随意保持低调。

答案 3 :(得分:16)

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

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

答案 4 :(得分:9)

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

答案 5 :(得分:6)

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

希望这可以帮到你。

答案 6 :(得分:1)

与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>

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