在Android API 18中,windowContentOverlay发生了什么?

29

我将我的手机升级到Android 4.3后,发现操作栏下的阴影不再显示。在我的应用程序中,我使用windowContentOverlay自定义了一个阴影:

<item name="android:windowContentOverlay">@drawable/shadows_bottom</item>

一直在显示的内容,在API 18上突然消失了。从主题中移除该行并没有改变任何东西。而在其他API版本上,它会显示一个默认的轻微阴影。

还有其他人注意到这个问题吗?


我今天在我们的应用程序中也注意到了同样的问题。希望有一个简单的解决方案。 - twaddington
你正在使用ActionBarSherlock吗? - tad
我在Github链接中已经发布了我的临时解决方案,即使用九路径可绘制作为操作栏的背景,并将windowContentOverlay设置为@null。问题是你无法实现完美的解决方案,因为在最新的API中,阴影被定位在操作栏下面,所以如果你的阴影现在从灰色开始,到最后变成白色,那么操作栏的最后几个像素就会变成白色。如果你现在选择一个操作栏项目,你会发现“选定颜色”在视觉上与操作栏不对齐。 - David
是的,我尝试了那个解决方案,但它并不像你描述的那样完美。现在我正在做我认为 Spotify 所做的事情。我让我的 windowContentOverlay 粘在布局根视图的顶部。它给出了相同的结果。感觉像是一个 hack,我想知道他们为什么改变了这个而没有写任何相关的东西。 - Romain Piel
1
这个问题似乎在API 19级别得到了修复。 - twaddington
显示剩余4条评论
2个回答

30

我能够通过在我的基础FragmentActivity中添加以下方法并在布局被填充后在onCreate中调用它来解决这个平台的bug:

/**
 * Set the window content overlay on device's that don't respect the theme
 * attribute.
 */
private void setWindowContentOverlayCompat() {
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN_MR2) {
        // Get the content view
        View contentView = findViewById(android.R.id.content);

        // Make sure it's a valid instance of a FrameLayout
        if (contentView instanceof FrameLayout) {
            TypedValue tv = new TypedValue();

            // Get the windowContentOverlay value of the current theme
            if (getTheme().resolveAttribute(
                    android.R.attr.windowContentOverlay, tv, true)) {

                // If it's a valid resource, set it as the foreground drawable
                // for the content view
                if (tv.resourceId != 0) {
                    ((FrameLayout) contentView).setForeground(
                            getResources().getDrawable(tv.resourceId));
                }
            }
        }
    }
}

这样做非常好,因为您不需要更改主题或动态添加视图到布局中。它应该是向前兼容的,并且一旦修复了此错误,可以轻松地将其删除。


如果/当谷歌修复了这个漏洞,使用此修复程序的应用程序是否会出现双重windowContentOverlays,直到它们得到更新? - Dave Feldman
@DaveFeldman 这取决于情况。如果他们增加了API版本,那么应用程序就不会有双重覆盖。如果他们发布了一个不改变SDK版本的增量更新,那么是的,你可能会有用户出现重复覆盖。 - twaddington
谢谢,这对我很有用!我建议在您的基本活动中将setWindowContentOverlayCompat方法声明为protected,然后扩展此基本活动并在onCreate中调用该方法。 - moondroid

19

我已经设置了构建目标API 19,但仍然出现“找不到资源”的错误 :/ - Jacek Kwiecień
1
我认为该设备必须具有API 19(4.4)。这个问题发生在4.3上,但不会出现在4.2或4.1.2上! - Ionut Negru

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