应用程序主题中的样式工具栏

7

关于Android主题和样式的问题和文章有很多 - 我已经阅读了其中一半,但我还是感到很困惑

我想要的 - 出自我的Web应用程序开发背景,那些可爱友好的CSS样式表让我认为这会很容易 - 就是为我的应用程序创建一个主题,并在该主题中指定我的工具栏颜色(我按照官方文档的说明对每个Activity进行指定)。

因此,在我的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应用程序!
更新:好的,我已经弄清楚了,虽然我的工具栏的背景颜色需要在应用于工具栏的样式中设置,以防止该背景颜色传播到所有子视图,但所需的文本颜色需要在主题中指定,因为在工具栏中显示的文本是一个子视图(即使我在活动的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>

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

所以我想我已经实现了我的目标,但我没有回答我的最初问题:为什么我的主题不能隐式地应用工具栏样式?为什么我必须在工具栏的标记中显式声明它?
2个回答

0

对我来说:

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

改为:

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

非常好用。


0

做类似这样的事情:

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

此外,阅读这里的信息可以了解风格和主题。请参考这里的链接

嗯,这确实使我的工具栏文本变成了白色,但它也将工具栏内的所有内容都样式化成了工具栏,所以工具栏中的文本本身就像工具栏一样呈现出凸起的外观。不确定如何在评论中包含屏幕截图。然而,这正是我预期的,因为我想象应用主题而不是样式到工具栏不仅会对该视图进行样式化,还会对子视图进行样式化?这不是我想要的。 - Philip Stratford
我没有定义“TextStyle”,所以那样做行不通。我可以创建一个,但那样做只是覆盖了我一开始就不想要的工具栏继承的主题。我只想给工具栏本身设置样式,而不是它的子元素。除非工具栏中的文本实际上是工具栏的子元素?我甚至不确定你链接的那篇文章的作者是否完全清楚主题和样式之间的区别。它们的预期范围不仅不同,而且具有不同的属性。 - Philip Stratford
当您将样式应用于工具栏时,所有子项都会受到影响。这就是为什么popupTheme存在的原因。请阅读Android文档中有关默认工具栏主题的内容,并将其用作您的主题。请参见我在答案中添加的链接。 - AlphaQ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接