JohnRogersColumbiaEDU
JohnRogersColumbiaEDU

Reputation: 139

android - progress bar on splash screen

My app displays a splash screen while the app is loading. I want to put an animated progress bar below the icon on the splash screen. I tried using XML, but it's crashing! Says invalid tag progressbar.

Here's my code to call the splash screen, in styles.xml

<style name="AppTheme.BrandedLaunch" parent="AppThemeDark">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowBackground">@drawable/background_splash</item>
</style>

Here's my background_splash.xml file

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

<item>
    <bitmap
        android:gravity="center"
        android:tileMode="disabled"
        android:src="@drawable/ic_launcher"/>
</item>

<item>
<ProgressBar
    android:id="@+id/progressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
/>
</item>
</layer-list>

I don't really want to make a splash screen using a different method, because this method was really simple. Any ideas?

Upvotes: 8

Views: 12324

Answers (3)

Brayan Loayza
Brayan Loayza

Reputation: 698

the key is in this tutorial: http://www.logicchip.com/android-splash-screen-progress-bar/ You must create un file in drawable folder: example splas_screen.xml

    <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    android:layout_height="100dp">
    <item>
        <color android:color="@color/main_color_grey_50"/>
    </item>
    <item>
        <bitmap
            android:gravity="center"
            android:filter="true"
            android:src="@drawable/logomies"
            />
    </item>
</layer-list>

Add new Style to file styles.xml

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

AndroidManifest file you should set the SplashActivity like your LAUNCHER Activity.

<application
        android:name=".ActBenApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/ActivityTheme">

        <activity android:name=".main.ui.SplashActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:theme="@style/SplashTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".main.MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait">
        </activity>
    </application>

The important part comes here: you must create a layout where the progress bar will be, this layout has no background so the progress bar appears forward of slash.

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/splash_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".main.ui.SplashActivity">


    <ProgressBar
        android:id="@+id/progressBar2"
        style="?android:attr/progressBarStyleHorizontal"
        android:visibility="visible"
        android:indeterminateOnly="true"/>
</android.support.constraint.ConstraintLayout>

Finally in your Activity.java file:

public class SplashActivity extends AppCompatActivity{

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);


        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                // This method will be executed once the timer is over
                // Start your app main activity
                Intent i = new Intent(SplashActivity.this, MainActivity.class);
                startActivity(i);

                // close this activity
                finish();
            }
        }, 3000);
    }
}

Set as the setContentView to the layout created. That is all..!

Upvotes: 3

Pratik Popat
Pratik Popat

Reputation: 2999

Here is one hack.

SplashActivity.java

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final View rootView = getWindow().getDecorView().getRootView();
        rootView.setBackgroundDrawable(getResources().getDrawable(R.drawable.test));
        rootView.post(new Runnable() {
            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void run() {
                ((AnimationDrawable) rootView.getBackground()).start();
            }
        });
    }

test.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/list"
        android:oneshot="false">
        <item
            android:drawable="@drawable/frame_1"
            android:duration="20" />
        <item
            android:drawable="@drawable/frame_2"
            android:duration="20" />
        <item
            android:drawable="@drawable/frame_3"
            android:duration="20" />
        <item
            android:drawable="@drawable/frame_4"
            android:duration="20" />
        <item
            android:drawable="@drawable/frame_5"
            android:duration="20" />
        <item
            android:drawable="@drawable/frame_6"
            android:duration="20" />
        <item
            android:drawable="@drawable/frame_7"
            android:duration="20" />
        <item
            android:drawable="@drawable/frame_8"
            android:duration="20" />
        <item
            android:drawable="@drawable/frame_9"
            android:duration="20" />

    </animation-list>

Upvotes: 1

Sagar Pujari
Sagar Pujari

Reputation: 343

Don't put widgets like progressbar and imageview(bitmap) in the drawable file, instead add it in your layout file, in which parent layout should be relative layout and then set relativelayout background color as splash_screen_bg and add imageview and progressbar inside relative layout.

Upvotes: 0

Related Questions