飞溅前的空白屏幕

时间:2015-05-20 07:24:07

标签: android splash-screen

主要问题是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>

11 个答案:

答案 0 :(得分:24)

一般来说,建议不要在应用中使用启动画面,但如果你真的必须这样做。

Android会在根据您为其设置的主题加载活动布局之前加载空白布局。解决方案是将splash活动的主题设置为透明主题。

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>

答案 1 :(得分:17)

最好使用主题背景作为开始活动,但如果您不希望在启动主要活动之前出现空白屏幕,则可以按以下方式定义您的活动:

android:windowDisablePreview添加到res / values / styles.xml中的 AppTheme

<?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对您的活动背景没有影响,因此您无需担心。

答案 2 :(得分:5)

只需在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>

答案 3 :(得分:5)

你在这里遇到的问题被称为'冷启动',这是你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/

答案 4 :(得分:3)

真!以下链接为我工作!!!!

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>

答案 5 :(得分:2)

它&#39;的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"
     >

答案 6 :(得分:1)

支持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

答案 7 :(得分:0)

我只是通过更新Android Studio中的构建工具来修复我的问题。

答案 8 :(得分:0)

我认为这类似于上面已经发布的一些答案。我仍然想向您推荐以下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();
}

答案 9 :(得分:0)

将此添加到样式文件中

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

答案 10 :(得分: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>