Android:在启动的Activity上设置窗口背景

28

我阅读了Romain Guy在博客文章中有关设置窗口背景和感知性能的内容,并尝试模仿它。 这是一个非常简单的解决方案,但我不确定为什么无法使其工作,因为活动简单地拒绝选择指定的背景。

我有一个ListView,当onListItemClick被触发时,会启动一个新的Activity,需要3-5秒才能完全加载。 在用户等待的同时,我想绘制一个windowBackground,以便他们在实际准备好之前就可以'看到'该活动。 这是我的代码:

所启动的活动的AndroidManifest片段:

<activity 
        android:name=".activity.EditorActivity"
        android:screenOrientation="portrait"
        android:windowBackground="@drawable/background_editor">

EditorActivity的XML布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView 
    android:id="@+id/editor"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:text="Editor" />
</FrameLayout>

最后,在 Manifest 中设置可绘制资源,即 background_editor.xml:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/editor_bg"
    android:tileMode="repeat" />

editor_bg是位于drawable文件夹中的.png文件。

最终结果是启动EditorActivity并且我只看到了默认的黑色背景和白色显示的"Editor"文本(我添加了这个来测试XML文件是否正确加载)。

我也尝试过通过android:background="@android:color/transparent"将FrameLayout和TextView的背景设置为透明,以为它们可能默认为黑色背景,但没有成功。

已经过去了几天,我肯定错过了一些简单的东西...我在这里犯了什么明显的错误吗?

3个回答

66

尝试在以编程方式启动新活动之前设置窗口背景。

getWindow().setBackgroundDrawableResource(R.drawable.my_drawable);

5

我遇到了同样的问题,并浪费了一整天的时间。我们不能像我的情况一样在Java中设置主题,因为控制在我的启动画面活动的onCreate方法中来得很晚,而此时黑屏仍然可见。

这给了我提示,窗口必须从我们在清单文件中指定的主题中进行管理。

这是我的清单文件:

<activity
        android:name=".main.activities.SplashScreen"
        android:theme="@style/Splash"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>

现在我创建的主题如下所示:
<style name="Splash" parent="@style/Theme.AppCompat.Light">
    <item name="android:windowBackground">@drawable/splash</item>
    <item name="android:windowNoTitle">true</item>
    <item name="windowNoTitle">true</item>
    <item name="colorPrimaryDark">@color/green_09</item>
    <item name="colorPrimary">@color/green_09</item>
    <item name="windowActionBar">false</item>
</style>

在包含位图资源的可绘制资源中添加Splash,我需要进行一些调整,使其看起来完美而不会被拉伸,并且在居中位置。
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:antialias="true"
    android:dither="true"
    android:gravity="fill"
    android:src="@drawable/splash_screen" />

2

如果我在styles.xml文件的主题样式中声明了这个内容,它对我有效:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"   
xmlns:app="http://schemas.android.com/apk/res-auto">

    <style name="CustomTheme" parent="android:Theme.Holo.NoActionBar">
        <item name="android:windowBackground">@color/bg_evening</item>
    </style>

</resources>

在清单文件中,我将这个主题设置为我的应用程序:
<application
    android:name="com.my_app.pack"
    android:theme="@style/CustomTheme" >
...

或者转到我的活动之一:
<activity
    android:name="..."
    android:theme="@style/CustomTheme">
...

您可以声明多个主题样式,并将其中任何一个添加到任何活动中,这将覆盖应用程序设置的主题。


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