【问题标题】:Style Toolbar From App Theme来自应用主题的样式工具栏
【发布时间】:2016-12-09 16:30:04
【问题描述】:

关于 Android 主题和样式的问题和文章有上百万个 - 我已经阅读了其中的一半和I'm still going crazy

我想要的只是为我的应用程序创建一个主题,并在该主题中指定我的工具栏的颜色(我正在为每个活动指定它们,我认为在阅读 the official documentation 之后这样做是正确的。

所以,在我的styles.xml 文件中,我有:

<style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:toolbarStyle">@style/MyToolbar</item>
</style>

<style name="MyToolbar" parent="Base.Widget.AppCompat.Toolbar">
    <item name="android:textColor">#ffffff</item>
    <item name="android:textColorPrimary">#ffffff</item>
    <item name="android:elevation">4dp</item>
    <item name="android:background">@color/colorPrimary</item>
</style>

在我看来,我在这里为我的工具栏创建了一种样式,然后在我的主题中引用了该样式。然后我将我的主题设置为AndroidManifest.xml中的应用程序主题:

android:theme="@style/MyTheme"

在大多数情况下,这是可行的。我的主题中引用了其他样式,为了简单起见,我在代码中省略了这些样式,它们可以正常工作 - 我的按钮、文本视图等按照我创建的样式设置样式。

但讨厌的工具栏不是。我已经尝试直接在工具栏 xml 中引用我的样式(即使我不明白为什么我需要在主题中指定它):

<android.support.v7.widget.Toolbar
    android:id="@+id/main_activity_toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    style="@style/MyToolbar">
</android.support.v7.widget.Toolbar>

令人沮丧的是,这确实会导致工具栏的背景颜色与我想要的一样,但文本仍然是黑色,即使我试图将其设为白色。

我是否误解了主题引用样式然后应用于活动或整个应用程序的方式?工具栏有什么独特之处吗?与从头开始编写整个应用程序的其余部分相比,我花了更长的时间来尝试解决这个问题,这是我的第一个 Android 应用程序!

更新: 好的,所以我已经计算出,虽然我的工具栏的背景颜色需要设置为应用于工具栏的 style,以防止将背景颜色传播到所有子视图,但所需的文本颜色需要在 theme 中指定,因为工具栏中显示的文本是子视图(即使我在活动的 xml 中看不到它)。所以,这行得通:

styles.xml:

<style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:buttonStyle">@style/MyButton</item>
    <item name="android:editTextStyle">@style/MyEditText</item>
</style>

<style name="MyToolbarStyle" parent="Base.Widget.AppCompat.Toolbar">
    <item name="android:elevation">4dp</item>
    <item name="android:background">@color/colorPrimary</item>
</style>

<style name="MyToolbarTheme" parent="Base.Widget.AppCompat.Toolbar">
    <item name="android:textColorPrimary">#ffffff</item>
</style>

ma​​in_activity.xml

<android.support.v7.widget.Toolbar
    android:id="@+id/main_activity_toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    style="@style/MyToolbarStyle"
    app:theme="@style/MyToolbarTheme">
</android.support.v7.widget.Toolbar>

所以我想我已经实现了我想要的,但我还没有回答我最初的问题:为什么工具栏样式没有从我的主题中隐式应用?为什么我必须在工具栏的标记中明确声明它?

【问题讨论】:

    标签: android android-theme android-styles


    【解决方案1】:

    做这样的事情:

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

    此外,请在此处阅读information,以了解有关样式和主题的信息。参考this这里的链接。

    【讨论】:

    • 好的,这确实使我的工具栏文本变白,但它也将工具栏内的所有内容设置为工具栏,因此工具栏中的文本本身具有凸起的外观,就像工具栏一样。不知道如何在评论中包含屏幕截图。但是,这是我所期望的,因为我想将主题而不是样式应用于工具栏样式不仅是该视图,还有子视图?这不是我想要的。
    • 我没有定义“TextStyle”,所以这不起作用。我可以创建一个,但接下来我要做的就是覆盖从工具栏继承的一个我一开始不想要的主题。我只想设置工具栏本身的样式,而不是其子项。除非工具栏中的文本实际上是工具栏的子项?我什至不确定您链接到的那篇文章的作者是否完全清楚主题和样式之间的区别。它们不仅预期范围不同,而且具有不同的属性。
    • 当您将样式应用到工具栏时,其所有子项都会受到影响。这就是 popupTheme 存在的原因。阅读 Android 文档中的默认工具栏主题并将其用作您的主题。请参阅我在答案中添加的链接。
    【解决方案2】:

    对我来说:

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

    代替:

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

    效果很好。

    【讨论】:

      猜你喜欢
      • 2015-07-28
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多