Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set the splash screen for react-native android

How does one set a splash screen for react-native android, I can't find anything on the topic and I thought it was odd.

Thanks

like image 494
Adam Katz Avatar asked Jan 27 '16 15:01

Adam Katz


People also ask

How do I change the splash screen in Android react-native?

To change this, in your android/app/src/main/res/drawable folder create an image called splash. png . Then in splash_screen. xml change @mipmap/ic_launcher to @drawable/splash .

How do I set up react-native splash screen?

Start by creating a new directory called src/screens/ and inside it, add the first file with the name HomeScreen. js and with the following code snippet: import React from 'react'; import {View, Text, StyleSheet, Pressable} from 'react-native'; const HomeScreen = ({navigation}) => { return ( <View style={styles.

How do you add a dark mode splash screen to a react-native app?

You can toggle a light or dark splash screen based on your phone's settings. In Android, you can find the setting here: Settings -> Display -> Dark mode .


3 Answers

I had tried 3 of the following ways. The first one is what I am currently using for android splash screen for react-native projects.

  1. Using a npm package written by other.

    reference: https://github.com/remobile/react-native-splashscreen

  2. Create a SplashScreen component and redirect afterward.

    reference: How to create some kind of Splash screen/Launching screen, which disappears after App loaded? (React Native)

  3. Natively in java code.

    reference: https://www.bignerdranch.com/blog/splash-screens-the-right-way/

I have a fetch request in the componentDidMount() of initialRoute.

Using the first way from the list above performs the request while showing the splash screen.

Whereas the second way, needs to wait until the SplashScreen component get unmounted.

Third way is slightly more codes to write and maintain.

like image 59
chinloong Avatar answered Oct 26 '22 07:10

chinloong


This tutorial here works great - I quoted it and modified a bit, I added the react-native-background-color touch.

https://medium.com/react-native-development/change-splash-screen-in-react-native-android-app-74e6622d699 (which is based on this https://www.bignerdranch.com/blog/splash-screens-the-right-way/ - so this is native Android technique)

  1. You need to create splash screen in res/drawable. Let’s call it splash_screen.xml

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item
            android:drawable="@android:color/white"/>
    
        <item>
            <bitmap
                android:gravity="center"
                android:src="@mipmap/ic_launcher"/>
        </item>
    
    </layer-list>
    
  2. Now you need to update res/values/styles.xml

    <resources>
    
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <!-- Customize your theme here. -->
        </style>
    
    <style name="SplashTheme" parent="AppTheme">
            <item name="android:windowBackground">@drawable/splash_screen</item>
        </style>
    
    </resources>
    
  3. Now open AndroidManifest.xml and replace AppTheme with SplashTheme in MainActivity

    <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/SplashTheme"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
    </activity>
    

    We use SplashTheme instead of updating AppTheme, to add this background only to start activity and leave other stuff without changes.

  4. After you try the above out, you will notice the splash screen will always stay under your js views. You have two options to hide the splash screen:

    • Either use react-native-background-color module from https://github.com/ramilushev/react-native-background-color to set a color on the background which will remove the image. (This is the recommended way because when keyboard shows in some cases, it makes the root view visible for a split second.)
    • Or set a solid (non-transparent) background color on your root view.

Note on what "root view" means. This is the very first <View> you render in your app that you control (meaning that you can style it).

Custom Color

If you want to use a custom color, other then @android:color/*** then what you have to do is create colors.xml at android\app\src\main\res\values\colors.xml and define a colors like this:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="foobar">#ca949b</color>
</resources>

You can use whatever name and whatever color code.

Then back in splash_screen.xml we update <item android:drawable="@android:color/white" /> to be <item android:drawable="@color/foobar" />

Extra info on removing the background splash image from behind

After you create a splash like this. You will notice that the image stays in the background forever. To remove this image use this module - https://github.com/ramilushev/react-native-background-color - and call BackgroundColor.setColor('#XXXXXX') with whatever color. It will remove the image.

Instead of using an opaque color on your root view to cover the splash, it is still recommended to use the above module, because when the keyboard shows, the background view shows for a split second.

like image 38
Noitidart Avatar answered Oct 26 '22 07:10

Noitidart


Did you try to use this? I came across this a few days ago. Works fine on iOS but I haven't tested it yet on Android (it should be fine). You should have node >= 6 and imageMagic installed. (for mac: brew install imagemagic)

npm install -g yo generator-rn-toolbox
yo rn-toolbox:assets --splash IMGAE --android
like image 11
Bat Avatar answered Oct 26 '22 07:10

Bat