Reputation: 139
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
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
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
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