如何在我的ActionBar(ActionBarSherlock)上添加阴影效果?

14

我正在包含我的样式化的XML布局:

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="Theme.Styled" parent="Theme.Sherlock">
        <item name="actionBarStyle">@style/Widget.MyApp.ActionBar</item>
        <item name="android:actionBarStyle">@style/Widget.MyApp.ActionBar</item>

    </style>

    <style name="Widget.MyApp.ActionBar" parent="Widget.Sherlock.Light.ActionBar">
        <item name="titleTextStyle">@style/Widget.MyApp.TitleTextStyle</item>
        <item name="background">@color/red</item>
        <item name="android:background">@color/red</item>
        <item name="windowContentOverlay">@null</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>

    <style name="Widget.MyApp.TitleTextStyle" parent="TextAppearance.Sherlock.Widget.ActionBar.Title">
        <item name="android:textColor">@color/white</item>
        <item name="android:textSize">21sp</item>
    </style>

</resources>

有些互联网搜索建议使用windowContentOverlay设置为@null。但是当我在样式XML中使用它时,它没有改变任何东西。有人能帮忙解决吗?

3个回答

30

如果您想在ActionBar下面创建阴影,您需要在应用程序主题上设置android:windowContentOverlay参数(在您的代码中,您错误地将其设置在ActionBar样式上)。

在您的示例中,应该是:

<style name="Theme.Styled" parent="Theme.Sherlock">
        ...
        <item name="android:windowContentOverlay">@drawable/my_actionbar_shadow</item>
</style>

使用@null值可以去掉阴影。

这一行代码可以在Android 3.0及以上版本上设置ActionBar的阴影。但是,如果你使用ActionBarSherlock,则不会像你预期的那样工作。在运行系统早于Android 4.0的Android设备上,在ActionBarSherlock之上创建窗口顶部的阴影(尽管ActionBar自Android 3.0以来已经存在于api中,但ActionBarSherlock对于所有旧于Android 4.0的Android版本都使用自定义实现)。

要在ActionBarSherlock下方创建阴影,您需要在应用程序主题上设置windowContentOverlay参数(请注意缺少android:)。

<style name="Theme.Styled" parent="Theme.Sherlock">
        ...
        <item name="windowContentOverlay">@drawable/my_actionbar_shadow</item>
</style>

再次强调,使用@null可以移除阴影。

虽然这行代码对ActionBarSherlock有效,但在运行Android 4.0及以上版本的设备上不起作用,没有阴影出现在ActionBar下方。那么如何结合这两个参数才能在ActionBar和ActionBarSherlock下都获得所需的阴影呢?

使用资源配置限定符,在你的情况下使用平台版本限定符。在res/values/styles.xml中使用第二段XML代码,在res/values-v14/styles.xml中使用第一段XML代码。因此,默认情况下使用ActionBarSherlock版本(适用于Android 4.0之前的版本),而Android 4.0及以上版本则使用ActionBar版本。

编辑: Android 4.3(API级别18)存在一个bugandroid:windowContentOverlay无法正常工作。它应该会在未来的版本中修复。如果您需要在Android 4.3中修复它,则可以在错误报告中找到解决方法链接。


5
作为之前的回答中提到的,应该在应用主题中使用“windowContentOverlay”,而不是操作栏样式。
<style name="Theme.Styled" parent="Theme.Sherlock">
        ...
        <item name="windowContentOverlay">@drawable/my_actionbar_shadow</item>
</style>

如果您想要一个逼真的阴影,可以在“您的Android文件夹”/platforms/android-16/data/res/drawable-hdpi/中找到一个。

ab_solid_shadow_holo.9.png,将其复制到drawable-hdpi文件夹中,最终结果为:

<style name="Theme.Styled" parent="Theme.Sherlock">
        ...
        <item name="windowContentOverlay">@drawable/ab_solid_shadow_holo</item>
</style>

1
Android 9补丁图像不太美观,最终我使用了自己的。谢谢 :) - Mehdiway

3
此外,在API21(Lollipop)以上的版本中,你也需要在代码中添加这个。
getSupportActionBar().setElevation(0);

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