23

I have problem with my splash screen on Android. Splash screen is displayed to the user during long application startup but activity background is always black. I mean background bitmap (splash image) is visible, but background is black instead of white. I'm using PNG image with transparency.

What I have:

  1. PNG splash screen image with transparent background
  2. Splash screen activity
    [Activity(MainLauncher = true, Theme = "@style/Theme.Splash", NoHistory = true)]
    public class SplashScreen : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Do your app initialization here
            // Other long running stuff

            // Run app when done
            StartActivity(typeof(MainForm));
        }
    }
  1. Theme style for splash screen activity in resources/values/styles.xml
    <resources>
      <style name="Theme.Splash" parent="@android:style/Theme.Holo.Light">
        <item name="android:windowBackground">@drawable/splash_centered</item>
        <item name="android:windowNoTitle">true</item>
      </style>
    </resources>
  1. Splash drawable in resources/drawable/splash_centered.xml
    <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@drawable/splash"
        android:gravity="center"
        android:background="@color/white"> <!-- this is ignored -->

Problem: As you can see, I'm using Theme.Holo.Light as parent theme and I'm using it in the rest of my app. Holo light is using white background. This white background is not applied on SplashActivity background. SplashActivity background is always black. Background bitmap (splash image) is visible, but background is black instead of white. I'm using PNG image with transparency.

Question: How to set default Holo.Light theme background color (white) on the SplashScreen activity?

Note: I'm using Xamarin.Android, but styling is common for Android platform. Android version 4 and above.

Ludwo
  • 6,043
  • 4
  • 32
  • 48

3 Answers3

53

In resources/drawable/splash_centered.xml, instead of the bitmap use a layer-list

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
    <shape android:shape="rectangle">
      <solid android:color="@android:color/white" />
    </shape>
  </item>
  <item>
    <bitmap android:gravity="center" android:src="@drawable/splash" />
  </item>
</layer-list>
minnow
  • 1,091
  • 2
  • 10
  • 19
Jon Canning
  • 1,602
  • 16
  • 16
  • works great, actually better than solution with custom activity as theme displays image earlier – Mando Jan 30 '16 at 20:43
  • Where does this go? – Ian Warburton Dec 04 '17 at 20:52
  • @IanWarburton in resources/drawable/splash_centered.xml. Original question step 4, layer-list instead of the bitmap. – minnow Dec 14 '17 at 04:05
  • That worked perfectly... I wonder if anyone can share some path related to learning UI stuff like layer-list,vector images, etc.. there is so much that it gets confusing – Shachi May 07 '19 at 06:03
11

This is how I was able to get white background splash (logo centred) in Xamarin.

[Activity (Theme= "@style/Theme.Splash", MainLauncher=true, NoHistory=true)]            
public class SplashActivity : Activity
{
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);
        SetContentView (Resource.Layout.splash);
        ThreadPool.QueueUserWorkItem (o => LoadActivity ());
        // Create your application here
    }
    private void LoadActivity() {
        Thread.Sleep (1000); // Simulate a long pause
        RunOnUiThread (() => StartActivity (typeof(MainActivity)));
    }
}

with Theme.Splash as:

<resources>
  <style name="Theme.Splash" parent="@android:style/Theme.Light">
    <item name="android:colorBackground">@android:color/white</item>
    <item name="android:windowNoTitle">true</item>
  </style>
</resources>

and splash.axml code (Theme.Light.NoTitleBar) as:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:minWidth="25px"
    android:minHeight="25px"
    android:gravity="center">
    <ImageView
        android:src="@drawable/splash"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView1"
        android:layout_gravity="center" />
</LinearLayout>

NB: There is a slight delay in the splash png (logo) to come up, but its still acceptable, better than the black background.

Shibbs
  • 249
  • 1
  • 7
  • My background bitmap (splash image) is visible, but background colour is black instead of white. That's the point. I'm using PNG image with transparency. I updated my question to be more clear. – Ludwo Nov 29 '14 at 11:52
  • By the above workaround you would get a white background to your transparent splash image (in SplashActivity). – Shibbs Nov 30 '14 at 14:22
  • The only solution I've found online that worked. Thanks. – phillipwei Dec 12 '14 at 19:00
  • It does work, but it causes quite a stutter when the next activity starts. I suggest just loading a white background and then in the main activity you can show a logo while you are creating your app. This is the case for me because our app takes between 5 and 10 seconds to load, and we were already showing a logo. – Gandalf458 Mar 14 '15 at 04:11
1

set android:drawable="@color/colorWhite" to item.

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

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

    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/splash" />
    </item>
</layer-list>
Mike Yang
  • 2,581
  • 3
  • 24
  • 27