空白屏幕出现在启动画面之前。

43

主要问题是启动画面出现在2-3秒后。在启动画面之前会出现一个我不想要的空白布局。否则应用程序运行良好。只想删除在启动画面之前出现的空白布局。

MainActivity:

public class MainActivity extends Activity {

    private static String TAG = MainActivity.class.getName();
    private static long SLEEP_TIME = 5; // Sleep for some time

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.requestWindowFeature(Window.FEATURE_NO_TITLE); // Removes title bar
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);  // Removes notification bar

        setContentView(R.layout.activity_main);

        // Start timer and launch main activity
        IntentLauncher launcher = new IntentLauncher();
        launcher.start();
    }

    private class IntentLauncher extends Thread {

        @Override
        /**
         * Sleep for some time and than start new activity.
         */
        public void run() {
            try {
                // Sleeping
                Thread.sleep(SLEEP_TIME*1000);
            } catch (Exception e) {
                Log.e(TAG, e.getMessage());
            }

            // Start main activity
            Intent intent = new Intent(MainActivity.this, Login.class);
            MainActivity.this.startActivity(intent);
            MainActivity.this.finish();
        }
    }

}

主布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:background="@drawable/splash"
    tools:context=".MainActivity" >

</RelativeLayout>

1
可能是如何解决应用程序启动时的白屏问题?的重复问题。 - JPS
1
为什么要使用启动画面?在你的软件中,有一个只会让用户等待应用程序启动的屏幕有什么好处呢? - 2Dee
11个回答

38

一般来说,不建议在应用程序中使用闪屏界面,但如果你真的有必要。

Android会在加载基于你设置的主题的活动布局之前加载一个空白布局。解决方案是将启动界面的主题设置为透明主题。

res/values/styles.xml中创建一个透明主题。

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <style name="Theme.Transparent" parent="android:Theme">
      <item name="android:windowIsTranslucent">true</item>
      <item name="android:windowBackground">@android:color/transparent</item>
      <item name="android:windowContentOverlay">@null</item>
      <item name="android:windowNoTitle">true</item>
      <item name="android:windowIsFloating">true</item>
     <item name="android:backgroundDimEnabled">false</item>
  </style>
</resources>

然后在你的清单文件中设置主题

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

你需要更新styles.xml文件,将其修改为以下内容:<style name="Theme.MyTheme" android:theme="@style/Theme.Transparent"> <item name="android:windowDisablePreview">true</item> </style> - silentsudo
6
这个主题与AppCompatActivity不兼容,而且它也无法去除状态栏。 - Narendra Singh
这一点都不起作用。应用程序崩溃了。 - Khris Vandal

37

在启动活动中最好使用主题背景,但如果你不想在启动主活动之前显示空白屏幕,你可以像这样定义你的活动:

在res/values/styles.xml中为你的AppTheme添加android:windowDisablePreview

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <style name="AppTheme" parent="android:Theme">
        <item name="android:windowDisablePreview">true</item>
  </style>
</resources>

然后在清单文件中设置您的活动主题:

<activity android:name=".MainActivity" android:theme="@style/AppTheme">
...
</activity>

P.S:设置android:windowDisablePreview对您的活动背景没有影响,所以您无需担心。


3
禁用预览功能帮了我很大的忙。谢谢。 - Adam
应用程序崩溃了。 - Khris Vandal
2
android:windowDisablePreview 正是我所需要的。谢谢! - gcdev
1
当我们点击预览启动画面的图标时,它会在图标上花费一点时间。 - Mirza Hayat
对我不起作用 - JPM

13
您所面临的问题称为“冷启动”,大部分时间都花在您的Application.onCreate方法上,该方法通常进行一些初始化操作,可能比您希望的时间长。您可以在此处阅读官方文档:https://developer.android.com/topic/performance/launch-time.html 如果是这种情况,那么像其他人建议的将主题设置为半透明或禁用预览只会表面上解决问题,因为实际上您尝试启动应用程序时,不会收到有关您点击应用程序图标的反馈。您将看到您的应用程序启动有延迟,这并不是期望的用户体验。
一个空白、黑色或白屏,这真的取决于您主要活动主题中指定的android:windowBackground属性。 除了将您可能正在进行的某些初始化操作移动到您的Application.onCreate方法之外,最好的做法是按照此帖子建议使用标志图标品牌化您的预览窗口: https://plus.google.com/+AndroidDevelopers/posts/Z1Wwainpjhd 如果需要,您可以进一步提高用户体验,通过在闪屏界面中为标志图像添加动画效果,或通过设计预览窗口,使其可以平滑地过渡到主要活动内容,如在这里所描述的: http://saulmm.github.io/avoding-android-cold-starts 相同的问题在这里得到了正确的回答:https://stackoverflow.com/a/40482549/7094200,并在此博客文章中进行了说明:https://www.bignerdranch.com/blog/splash-screens-the-right-way/

8

支持AppCompatActivity

res/values/styles.xml

<style name="SplashTheme" parent="AppTheme">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:backgroundDimEnabled">false</item>
    <item name="android:windowDisablePreview">true</item>
</style>

GL

Source


太棒了,兄弟。节省了我很多时间。 - M.Kalidass

6

真的!下面的链接对我有用!!!

https://cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous/

为您的启动画面在style.xml中编写单独的样式,以便您可以将两个屏幕相关联。

以下是样式:

<style name="AppTheme.Splash" parent="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowBackground">@drawable/splash_final</item>
    </style>

非常感谢,这就是我一直在寻找的教程!我完全忘记了作者是谁。 - untosabla

3

这是关于Android功能的内容。你可以更改空白屏幕的背景颜色。使用样式:

<resources>
<style name="Theme" parent="android:style/Theme" />
<style name="Theme.MainTheme" parent="Theme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@drawable/background_drawable</item>
</style>
</resources>

然后在清单文件中使用它:

<application
    android:name="@string/app_name"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.MainTheme"
     >

3
我认为这与之前发布的某些答案类似。我仍然想推荐以下《Big Nerd Ranch指南》,因为它很好地阐述了如何正确创建启动画面。你真的应该去那里阅读,而不是继续下面的内容 :). https://www.bignerdranch.com/blog/splash-screens-the-right-way/ 简单来说,它建议您在应用程序启动时启动一个初始启动活动。对于此活动,您需要创建一个XML可绘制文件(@drawable/background_splash)。
<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>

然后您需要为启动界面创建一个主题,并将上面创建的可绘制对象设置为其窗口背景。
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="android:windowBackground">@drawable/background_splash</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>

最后,在您的启动界面中实现onCreate方法,如下所示(这是活动中所需的所有代码)。这将启动您的主要活动并完成闪屏活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent = new Intent(this, MainActivity.class);
    startActivity(intent);
    finish();
}

2
在你的样式文件中添加以下内容。
    <item name="android:windowDisablePreview">true</item>

1
这个不起作用。 - Khris Vandal

0

我通过更新Android Studio中的构建工具来解决了我的问题。


0

添加这个样式

 <style name="Theme.Transparent" parent="AppTheme">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowDisablePreview">true</item>
        <item name="android:windowContentOverlay">@null</item>
 </style>

如果您在启动画面中加载图像,则可以从您的布局中加载图像,例如以下代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/color_white">
    <ImageView
            android:id="@+id/ivSplash"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/SPLASH_IMAGE"
            />
</LinearLayout>

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