如何在我的主题中指定暗黑模式

10

我知道有一些关于样式化上下文操作栏(ActionMode)的问题,但它们似乎并没有完全解决我的问题。

我正在使用浅色主题和深色操作栏的工具栏(Toolbar)。 工具栏看起来像我想要的,但是动作模式看起来像常规的深色主题。 我需要在样式中进行哪些更改才能获得黑色主题的动作模式(而不仅仅是操作栏)? 似乎我应该能够通过利用 Theme.AppCompat 快速实现这一点,因为那样可以按照我想要的方式显示CAB,但我不想让应用程序的其余部分变暗。

我只关心API 14+,并且正在使用支持工具栏代替操作栏。

这是我的基础样式:

<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="android:actionModeBackground">@color/colorActionMode</item>
    <item name="android:windowActionModeOverlay">true</item>
</style>

工具栏样式

<style name="AppTheme.Toolbar" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:textColorPrimary">@color/abc_primary_text_material_dark</item>
    <item name="actionMenuTextColor">@color/abc_primary_text_material_dark</item>
    <item name="android:textColorSecondary">@color/abc_primary_text_material_dark</item>
    <item name="android:background">@color/colorPrimaryDark</item>
</style>

工具栏布局文件(在此处设置弹出主题似乎没有任何效果)。

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/actionBarSize"
    app:theme="@style/AppTheme.Toolbar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
    android:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
    android:elevation="2dp"
    android:focusable="false"/>

这是我的工具栏(我想要它的样子)

样式化工具栏

这是我的ActionMode(我需要倒转它)

我的操作模式

这是我想要ActionMode看起来的样子(通过将我的样式继承自Theme.AppCompat而不是Theme.AppCompat.Light.DarkActionBar获得)。问题是应用程序的其余部分变暗了,而我不想要。

暗色操作模式

4个回答

5

首先在您的基础主题中重载属性 actionModeStyle

<item name="actionModeStyle">@style/LStyled.ActionMode</item>

LStyled.ActionMode定义为:

<style name="LStyled.ActionMode" parent="@style/Widget.AppCompat.ActionMode">
    <item name="titleTextStyle">@style/LStyled.ActionMode.Title</item>
    <item name="subtitleTextStyle">@style/LStyled.ActionMode.Subtitle</item>
</style>

最后:

<style name="LStyled.ActionMode.Title" parent="@style/TextAppearance.AppCompat.Widget.ActionMode.Title">
    <item name="android:textColor">@color/color_action_mode_text</item>
</style>

<style name="LStyled.ActionMode.Subtitle" parent="@style/TextAppearance.AppCompat.Widget.ActionMode.Subtitle">
    <item name="android:textColor">@color/color_action_mode_text</item>
</style>

这将覆盖主题指定的标题和副标题(如果需要)的文本颜色。

剩下的是溢出按钮。打开任何支持颜色替换的图像编辑软件。使用AppCompat的res/drawable-XXXX文件夹中的溢出菜单PNG。将其涂成白色。接下来,在基础主题中覆盖actionOverflowButtonStyle并指定您刚修改的PNG:

<item name="actionOverflowButtonStyle">@style/LStyled.OverFlow</item>

<style name="LStyled.OverFlow" parent="@style/Widget.AppCompat.ActionButton.Overflow">
    <item name="android:src">@drawable/modified_overflow_icon</item>
</style>

关于主题的自定义,我无法提供太多的说明或教程。唯一的方法是查看框架中的[styles][themes].xml文件。阅读源代码也有帮助——您将了解使用哪些属性以及它们在哪里/是否可以进行自定义。

需要注意的一点:

我希望能够扩展一个样式,以获得内置于深色主题中的相同行为。

是的,但这可能并不理想。上面处理修改溢出菜单图标的部分可以用覆盖的colorControlNormal属性来替代。TintManager链接)使用colorControlNormal中的颜色值来着色溢出菜单可绘制图形(以及其他绘制图形)。请查看源代码中数组TINT_COLOR_CONTROL_NORMAL的内容。但是,通过覆盖colorControlNormal来修复一个可绘制图形可能会使应用程序的整体外观和感觉变差。


谢谢你的回答,但我正在寻找一种扩展内置样式的方法。我知道我可以在操作模式中替换溢出图标(和主页作为向上图标),但我希望避免这样做,只使用内置样式。 - Spencer
@Spencer 我只知道这个“变通方法”。如果我找到更优雅的解决方案,我会更新我的答案(并留下评论)。但是,在发布答案之前,我确实进行了研究。看起来你正在寻找的功能还没有被系统支持(尚未?)。 - Vikram
1
您在这里提供的答案基本上就是我在提问之前所做的(我还必须修改“home as up”图标)。我希望能够让系统完成所有这些工作,包括添加RTL支持等等,但我也没有想出来如何实现。不过感谢您的建议。 - Spencer

2

查看这篇博客文章,它解释了如何使工具栏变为暗色:

http://android-developers.blogspot.ie/2014/10/appcompat-v21-material-design-for-pre.html

<android.support.v7.widget.Toolbar
    android:layout_height=”wrap_content”
    android:layout_width=”match_parent”
    android:minHeight=”@dimen/triple_height_toolbar”
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

你可以指定一个工具栏 "style"。我认为你可能遗漏了应用样式于工具栏及其所有子项的应用程序命名空间 "theme" 属性。
编辑:对于你特定的情况,这应该可以工作。
<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="android:actionModeBackground">@color/colorActionMode</item>
    <item name="android:windowActionModeOverlay">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
</style>
<style name="AppTheme.Toolbar" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:textColorPrimary">@color/abc_primary_text_material_dark</item>
    <item name="actionMenuTextColor">@color/abc_primary_text_material_dark</item>
    <item name="android:textColorSecondary">@color/abc_primary_text_material_dark</item>
    <item name="android:background">@color/colorPrimaryDark</item>
</style>

我已经为工具栏设置了主题,并将我的工具栏声明添加到问题中。设置popupTheme似乎没有任何效果。我尝试了app.popupTheme和android:popupTheme。 - Spencer
我有相同的设置,我的应用程序主题继承自Theme.AppCompat.Light.NoActionBar,我的工具栏主题继承自ThemeOverlay.AppCompat.Dark.ActionBar,如我所述在我的答案中。 - darnmason
很遗憾,这些样式基本上与我已经拥有的相同。Theme.AppCompat.Light.NoActionBar 只是在样式中添加了我已经拥有的东西,而 Dark.ActionBar 主题对工具栏没有任何改变。当我尝试你提供的内容时,我得到了与我最初相同的结果。 - Spencer
是的,我理解你对于 NoActionBar 的观点,但 ThemeOverlay.AppCompat.Dark.ActionBar 才是关键。你有注意到它以 ThemeOverlay 开头而不仅仅是 Theme 吗?哈 - darnmason
是的,我复制并粘贴了你那里的内容。在我看来,ActionMode部分和工具栏是完全独立的。由于ThemeOverlay.AppCompat.Dark.ActionBar,工具栏看起来很棒,但当它翻转到ActionMode时似乎没有延续过来。 - Spencer

1
我只想在Vikram的回答上做一个补充,特别是关于对操作模式中溢出按钮和其他默认控件进行着色。
定义操作模式下这些按钮的颜色的'colorControlNormal'项目必须放置在操作栏主题中,而不是在操作模式样式中。只有这样,它才会用于操作模式内的溢出、完成、关闭和返回按钮。

0

尝试使用

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

改为。


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