如何在应用启动时修复白屏?


111

我有一个Android应用程序,在启动时会显示白屏2秒钟。我的其他应用程序不执行此操作,但此应用程序可以执行此操作。我还实现了一个初始屏幕,希望它可以解决此问题。我应该增加开机画面的睡眠时间吗?谢谢。


1
您正在开始的活动花费了太多时间才能发挥onCreate作用。尝试仅在该活动中“ setContentView”,然后检查是否已消除此延迟。
Sherif elKhatib 2013年

1
抱歉,我是新手,我没有Java经验,能否请您清楚解释一下?并请给一个“答案”,以便我可以打勾:)
匿名

1
您在项目中使用Java还是C#
Sherif elKhatib 2013年


Answers:


104

只需在AndroidManifest.xml文件的启动活动中提及透明主题即可。

喜欢:

<activity
        android:name="first Activity Name"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" >
 <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
 </activity>

并使用Activityclass代替扩展该屏幕AppCompatActivity

喜欢 :

public class SplashScreenActivity extends Activity{

  ----YOUR CODE GOES HERE----
}

4
但是final ActionBar actionBar = getActionBar();当主题为半透明时
某处某人

16
Pankaj-是的,我了解到UI体验不佳的原因是“预览”窗口...显然Google的某个人认为默认情况下使用白色预览窗口确实很棒。但是,在使用深色背景的应用中,这确实是个坏主意。解决方案是为您的应用创建自定义样式,并为要使用的颜色指定'android:windowBackground'。请参见“完美预览窗口” cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous
有人的地方

2
@Hagai L这给我一个错误,例如“ java.lang.IllegalStateException:您需要在此活动中使用Theme.AppCompat主题(或后代)”。
TejaDroid

1
android:theme =“ @ android:style / Theme.Translucent.NoTitleBar”对我不起作用,有什么建议吗?
周杰伦

1
@TejaDroid要获取停止错误“ java.lang.IllegalStateException”,您必须通过android.app.Activity扩展您的Activity,现在您正在使用AppCompactActivity。因此,对于AppCompactActivity,您不能使用常规主题。
准备

167

将其放在自定义样式中,可以解决所有问题。使用hacky半透明的修复程序可使您的任务栏和导航栏变得半透明,并使初始屏幕或主屏幕看起来像意大利面条。

<item name="android:windowDisablePreview">true</item>


3
Thx人,从许多麻烦中解救出来。最初我很难达到设置点。这将是主要主题块:内联`<style name =“ AppTheme” parent =“ Theme.AppCompat.NoActionBar”> <item name =“ android:windowDisablePreview”> true </ item>`应该是主要样式的入口点.xml
HumaN

2
谢谢!将其放在res文件夹中的style.xml中,放入样式标签名称=“ AppTheme”(或清单中使用的主题)
Dimmduh

为我工作。谢谢。
user1510006

我认为应该接受答案,因为许多开发人员都使用自定义主题
Sviatoslav Zaitsev

超级有帮助:)
jasan

74

在此处输入图片说明

就像您管一样。最初,它们显示的是图标屏幕,而不是白色屏幕。并在2秒后显示主屏幕。

首先在res / drawable中创建一个XML drawable。

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

    <item
        android:drawable="@color/gray"/>

    <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/ic_launcher"/>
    </item>

</layer-list>

接下来,将其设置为主题中启动活动的背景。导航到您的styles.xml文件,并为您的启动活动添加新主题

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

    <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/background_splash</item>
    </style>

</resources>

在新的SplashTheme中,将window背景属性设置为XML drawable。在AndroidManifest.xml中将其配置为启动活动的主题:

<activity
    android:name=".SplashActivity"
    android:theme="@style/SplashTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

该链接提供您想要的。循序渐进的过程。 https://www.bignerdranch.com/blog/splash-screens-the-right-way/

更新:

layer-list甚至可以这样简单(其还接受居中标志矢量图形内容不同于<bitmap>标签):

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Background color -->
    <item android:drawable="@color/gray"/>

    <!-- Logo at the center of the screen -->
    <item
        android:drawable="@mipmap/ic_launcher"
        android:gravity="center"/>
</layer-list>

1
这真的很棒,但是我如何在mipmap/ic_launcher
Hasan A Yousef上

6
这是最好的答案。原因是,使用上述解决方案时,应用的视觉启动会有所延迟。
Jnr


1
这应该是公认的答案,所有其他答案只是使它看起来像该应用程序从未从用户角度启动。一个更简单的可绘制对象layer-list可能是: <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Background color --> <item android:drawable="@color/white"/> <!-- Logo at the center of the screen --> <item android:drawable="@mipmap/ic_launcher" android:gravity="center"/> </layer-list>
Franco

当我们要以编程方式更改图层列表中的背景颜色(在您的示例中,例如从灰色更改为蓝色)时,此解决方案无法解决问题。在这种情况下,第一个灰屏出现一两秒钟,然后设置蓝色背景!
Mohammad Afrashteh

71

在style.xml中创建样式,如下所示:

<style name="Theme.Transparent" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

并将其与您在AndroidManifest中的活动配合使用:

<activity android:name=".ActivitySplash" android:theme="@style/Theme.Transparent">


6

这是我在示例应用程序上的AppTheme:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowIsTranslucent">true</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

如您所见,我具有默认颜色,然后添加并将其android:windowIsTranslucent设置为true

据我所知,作为Android开发人员,这是您需要设置的唯一东西,以便在应用程序启动时隐藏白屏。


4

这两个属性均使用其中任何一个。

    <style name="AppBaseThemeDark" parent="@style/Theme.AppCompat">
            <!--your other properties -->
            <!--<item name="android:windowDisablePreview">true</item>-->
            <item name="android:windowBackground">@null</item>
            <!--your other properties -->
    </style>

4

user543答案是完美的

<activity
        android:name="first Activity Name"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" >
 <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
 </activity>

但:

您的LAUNCHER Activity必须扩展Activity,而不是默认情况下的AppCompatActivity


我尝试了这个解决方案很多次,因为到处都写着同样的解决方案,但是却行不通->但是您的BUT节省了我的时间,我的Activity扩展了AppCompatActivity,这就是为什么它不起作用的原因,我将其更改为Activity了,谢谢您!
Rucha Bhatt Joshi

4

白色背景来自Apptheme。您可以显示有用的内容,例如应用程序徽标而不是白色屏幕。可以使用自定义主题来完成。在应用程序中,只需添加主题

android:windowBackground=""

属性。该属性值可以是图像或分层列表或任何颜色。


如果将透明色设置为窗口,则效果更好。 <item name="android:windowBackground">@android:color/transparent</item>
Amol Desai

这应该是公认的答案。无论如何,您知道如何添加youtube应用之类的缩放动画。
普拉瑟姆·凯萨卡'17

现在是黑色,而不是白色。
Ümañgßürmån

2

以下是建议如何设计启动画面的链接。为了避免出现白色/黑色背景,我们需要定义一个带有启动背景的主题,并将该主题设置为在清单文件中启动。

https://android.jlelse.eu/right-way-to-create-splash-screen-on-android-e7f1709ba154

res / drawable文件夹中的splash_background.xml

<?xml version=”1.0" encoding=”utf-8"?>
 <layer-list xmlns:android=”http://schemas.android.com/apk/res/android">

 <item android:drawable=”@color/colorPrimary” />

 <item>
 <bitmap
 android:gravity=”center”
 android:src=”@mipmap/ic_launcher” />
 </item>

</layer-list>

添加以下样式

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    <!-- Splash Screen theme. -->
    <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/splash_background</item>
    </style>

在清单设置主题中,如下所示

<activity
            android:name=".SplashActivity"
            android:theme="@style/SplashTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
    </activity>

2

我的一个项目中也遇到了同样的问题。我通过在提供给初始屏幕的主题中添加以下一些参数来解决该问题。

<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsTranslucent">true</item>

您可以在我撰写的此博客文章中找到原因和解决方案。希望能帮助到你。


请直接将详细信息添加到您的答案中。链接可能无效,这就是为什么我们希望答案包含实际内容,而链接只是补充性的。
OOBalance

1

可以通过将清单中的主题设置为来解决此问题

<activity
        android:name=".MySplashActivityName"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" >
 <intent-filter>
     <action android:name="android.intent.action.MAIN" />
     <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

之后,如果要获取
java.lang.IllegalStateException:此活动需要使用Theme.AppCompat主题(或后代)。
那么您可能需要在MySplashActivity中扩展Activity而不是AppCompatActivity

希望能帮助到你!


1

出现白色背景是由于Android在应用加载到内存时启动,如果您仅在SplashTheme下添加这两行代码,则可以避免这种情况。

<item name="android:windowDisablePreview">true</item>
<item name="android:windowIsTranslucent">true</item>

0

您应该禁用即时运行android studio设置。

File> Settings> Build,Execution,Deployment> Instant Run取消选中此处显示的所有选项。

注意:由于“ 即时运行”导致的白屏问题仅适用于Debug版本,该问题不会出现在发行版本中。


0

尝试以下代码:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

该代码对我有用,并且将在所有Android设备上工作。


不鼓励仅使用代码的答案。请单击“ 编辑”并添加一些单词,以概括您的代码如何解决问题,或者说明您的答案与以前的答案有何不同。评论来自
尼克

0

它的解决方案非常简单!

此问题有三个基本原因

  1. 您正在onCreateVeiw函数中执行繁重/长时间运行/复杂的任务
  2. 如果您使用的是线程。这样线程休眠时间可能会非常长。
  3. 如果您正在使用任何第三方库。这是初始化在应用程序启动时它可能会导致这个问题。

解决方案:

解决方案1:

  Remove the Heavy Task from onCreateView() function and place it some where appropriate place.

解决方案2:

  Reduce the Thread Sleep time.

解决方案3:

  Remove the Third party library at app initialize at implement them with some good strategy.

就我而言,我正在使用Sugar ORM,这会导致此问题。

分享改善。


0

这解决了问题:

编辑您的styles.xml文件:


粘贴以下代码:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>

</resources>

并且不要忘记在AndroidManifest.xml文件中进行修改。(主题名称

请注意该文件中活动的声明顺序。


0
I encountered a similar problem and to overcome it, I implemented the code below in styles, i.e res->values->styles->resource tag 
<item name="android:windowDisablePreview">true</item>

Here is the whole code:

<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowDisablePreview">true</item>
</style>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.