带有Theme.AppCompat的黑暗动作栏

fai*_*zal 8 android android-source android-theme

我正在使用Theme.AppCompat我的应用程序来获得黑暗的外观.一切看起来都不错,除了使用这个主题的动作栏看起来很古老,即它有一个明亮的蓝色底部分隔线.

我希望操作栏看起来像它Theme.AppCompat.Light.DarkActionBar.

看一下themes.xml,我发现:

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


<style name="Theme.Base.AppCompat.Light.DarkActionBar" parent="Theme.Base.AppCompat.Light">
    <item name="actionBarDivider">@drawable/appcompat_divider_dark</item>
</style>
Run Code Online (Sandbox Code Playgroud)

所以我创建自己的风格如下:

<style name="myTheme" parent="@style/Theme.AppCompat">
    <item name="actionBarDivider">@drawable/appcompat_divider_dark</item>
</style>
Run Code Online (Sandbox Code Playgroud)

但是我得到了构建错误:

No resource found that matches the given name (at 'actionBarDivider' with value 
 '@drawable/appcompat_divider_dark')
Run Code Online (Sandbox Code Playgroud)

为什么我不能使用框架使用的相同drawable?

fai*_*zal 1

蓝线是用于操作栏的背景图像的一部分。例如,您可以在以下位置找到它: sdk/platforms/android-19/data/res/drawable-xxhdpi/ab_transparent_dark_holo.9.png

诀窍是通过继承创建您自己的 Widget 样式,Widget.AppCompat.ActionBar并使用您想要的 png 设置背景属性,该属性没有蓝线。我使用支持库的现有@drawable/abc_ab_bottom_transparent_dark_holo. 您可以在文件夹中找到它sdk/extras/android/support/v7/appcompat/res/drawable-hdpi/

因此,在 styles.xml 文件中创建以下元素。

<style name="myActionBar" parent="@style/Widget.AppCompat.ActionBar">
        <item name="android:background">@drawable/abc_ab_bottom_transparent_dark_holo</item>
</style>
Run Code Online (Sandbox Code Playgroud)

然后将这个新创建的样式包含在您的主题中(已存在于 styles.xml 文件中):

<style name="AppBaseTheme" parent="@style/Theme.AppCompat">
        <item name="android:actionBarStyle">@style/myActionBar</item>
</style>
Run Code Online (Sandbox Code Playgroud)

values-v14要在旧版 API 中启用此更改,请在所有 3 个文件夹 - 、values-v12和中进行相同的更改values。需要注意的一件重要事情是,“android:”命名空间不应用于values-v12values文件夹中的名称属性。