可能的透支:根元素在Theme.Holo中绘制背景

时间:2014-02-03 14:32:16

标签: android android-theme

我已经为这个问题读过类似的问题,但我无法在任何地方找到答案。为了解决透支问题,我使用以下内容:

<style name="MyTheme" parent="@android:style/Theme.Holo">
    <item name="android:windowBackground">@null</item>
</style>

当我在具有ActionBar的活动中使用它时,操作栏的背景颜色也会变为null。我怎样才能解决这个问题?如果我将操作栏的颜色设置为单独,则蓝色分隔符将消失。如何将下面框架的背景设置为空操作栏分隔符?

2 个答案:

答案 0 :(得分:0)

我建议如下:

创建2个单独的主题:一个用于带有操作栏的活动,另一个用于没有它的活动。

对于没有操作栏的活动,请使用您在帖子中提供的主题,即:

<style name="MyTheme" parent="@android:style/Theme.Holo">
    <item name="android:windowBackground">@null</item>
</style>

对于带有操作栏的活动,只需创建一个没有android:windowBackground项目的主题,而是设置您希望在该活动中拥有的特定背景颜色。然后,在为活动注释的布局文件中,删除android:background属性(因为它已经由主题设置)。

为了使它更具视觉效果,主题看起来可能如下:

<style name="MyThemeForActivityWithoutActionBar" parent="@android:style/Theme.Holo">
    <item name="android:background">@android:color/black</item>
</style>

活动的布局可能如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black" // remove this
    android:orientation="vertical" >
    ...
</LinearLayout>

我在上面的代码段中指出了我要删除的哪一行。

这有帮助吗? :)

答案 1 :(得分:0)

以不同的方式解决您的透支问题。在android:windowBackground中设置所需的背景,而不是从布局中删除背景。然后你会得到动作栏背景。

无论如何,使用空窗口背景是一个糟糕的解决方案,因为它会导致意外的副作用,例如渲染工件(或者在您的情况下缺少操作栏背景)。 Chet Haase在Developing for Android VIII The Rules: User Interface

中详细解释了这一点
  

避免空窗口背景

     

避免透支的一种方法是消除窗口背景   在层次结构中的视图都具有不透明的情况下   背景。也就是说,用户将看不到背景   窗口,如果视图层次结构完全覆盖该背景   一个或多个不透明的视图。

     

消除窗口背景可能是一种有效的技术,但它   往往是一种解决透支问题的复杂方法   导致在不同情况下渲染工件。虽然它是   可以在应用程序清单中设置空窗口背景,   由于系统不能,这可能导致图形伪影   正确绘制起始窗口。一个更正确的方法来做到这一点   是将起始窗口背景留在清单中,   但是在activity的onCreate()方法中通过调用将其设置为null   getWindow()的setBackground(空)。但即使这种方法也可能导致   文物。例如,如果键盘/ IME设置为adjustResize和   然后在那里为具有空背景的活动设置动画   可能是键盘后面的工件,因为它是动画的   窗口管理器没有任何东西可以为该背景绘制。也,   全屏列表视图可能具有过度弹跳反弹间隙的工件   (可以解决这个问题   ListView.setOverscrollFooter /报头())。

     

解决这种情况的透支问题的正确方法是   实际上使用起始窗口。而不是拥有容器   窗口背景和窗口之间自己不透明的背景颜色   视图,将您想要的背景绘制在窗口本身上   windowBackground主题属性让那些介入   容器保持默认的透明背景。