Android Library for making animated tutorials inside your app

Last update: Jul 12, 2022

##SlidingTutorial Awesome Header image

Cleveroad introduces Sliding Tutorial Library for Android

Hey guys, hope you haven’t started developing a tutorial for your Android app yet, as we have already completed a part of your job. Don’t worry, we act from good motives only. Our aim is to help you create a sliding tutorial in a fast and simple manner. So we’ve done some work and voila!. A simple Android Sliding Tutorial library is at your service.

Demo image

Also you can watch the animation of the Sliding Tutorial for Android on YouTube in HD quality.

The invention is going to ease the problem of structural design but not to limit a stretch of your imagination at the same time. We took care of the suitability aspect. So, your app is not going to look alien among other Android elements.

Read our Case Study: Sliding tutorial for Android by Cleveroad to make sure that you don’t miss a detail:

Article image

Applied parallax effects will make your product presentation look like Google apps tutorial.

All you need to do is:
1. Create background designs for each screen of your tutorial (assistance with mobile design)
2. Create icons for each screen of your tutorial
3. Follow the instructions below

Awesome

Full Documentation

Setup

To include this library to your project add dependency in build.gradle file:

    dependencies {
        implementation "com.cleveroad:slidingtutorial:1.0.9"
    }

Quick Start

Migrations

See all migration manuals.

Changelog

See changelog history.

Support

If you have any questions regarding the use of this tutorial, please contact us for support at [email protected] (email subject: «Sliding Tutorial: Android. Support request.»)
or
Use our contacts:
Cleveroad.com
Facebook account
Twitter account
Google+ account

License

    The MIT License (MIT)

    Copyright (c) 2015-2016 Cleveroad

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE.

GitHub

https://github.com/Cleveroad/SlidingTutorial-Android
Comments
  • 1. java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2

    I am using Android studio 2.3, Sliding Tutuorial 1.0.8. The following exception occurs if slide fast.

    java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
                                                         at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
                                                         at java.util.ArrayList.get(ArrayList.java:308)
                                                         at android.support.v4.view.ViewPager.getChildDrawingOrder(ViewPager.java:828)
                                                         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2166)
                                                         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                                                         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                                                         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                                                         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                                                         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                                                         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                                                         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                                                         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                                                         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                                                         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                                                         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                                                         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                                                         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                                                         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                                                         at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2403)
                                                         at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1737)
                                                         at android.app.Activity.dispatchTouchEvent(Activity.java:2771)
                                                         at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
                                                         at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2364)
                                                         at android.view.View.dispatchPointerEvent(View.java:9520)
                                                         at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4238)
                                                         at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4104)
                                                         at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3650)
                                                         at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3703)
                                                         at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3669)
                                                         at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3795)
                                                         at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3677)
                                                         at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3852)
                                                         at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3650)
                                                         at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3703)
                                                         at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3669)
                                                         at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3677)
                                                         at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3650)
                                                         at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5932)
                                                         at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5906)
                                                         at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5867)
                                                         at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6035)
                                                         at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                                                         at android.os.MessageQueue.nativePollOnce(Native Method)
                                                         at android.os.MessageQueue.next(MessageQueue.java:323)
                                                         at android.os.Looper.loop(Looper.java:135)
                                                         at android.app.ActivityThread.main(ActivityThread.java:5422)
                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    
    
    Reviewed by louisyonge at 2017-04-09 04:40
  • 2. How to solve manifest merger failed

    the error info :

    Error:Execution failed for task ':lib:processDebugAndroidTestManifest'. java.lang.RuntimeException: Manifest merger failed : Attribute [email protected] value=(@string/app_name) from [debug] AndroidManifest.xml:11:9-41 is also present at [com.cleveroad:slidingtutorial:0.9.4] AndroidManifest.xml:13:9-44 value=(@string/st_app_name). Suggestion: add 'tools:replace="android:label"' to element at manifestMerger41941130476540702.xml:7:5-9:19 to override.

    but I had add tools:replace="android:label to my application tag

    Reviewed by Andecy at 2016-04-19 03:46
  • 3. Change indicator color?

    I simply want to change the non-selected and selected colors but i seems i need to set some sort of renderer before it will draw them? If i don't specify one the indicator is now invisible, can i not use the "default" renderer?

    Reviewed by broakenmedia at 2016-11-10 16:45
  • 4. addOnTutorialPageChangeListener giving a nullPointerException

    I have implemented this tutorial directly in my tutorial activity using this code:

    private void replaceTutorialFragment() {
        final IndicatorOptions indicatorOptions = IndicatorOptions.newBuilder(this)
                .build();
        final TutorialOptions tutorialOptions = TutorialFragment.newTutorialOptionsBuilder(this)
                .setUseAutoRemoveTutorialFragment(false)
                .setUseInfiniteScroll(false)
                .setPagesColors(mPagesColors)
                .setPagesCount(TOTAL_PAGES)
                .setIndicatorOptions(indicatorOptions)
                .setTutorialPageProvider(new TutorialPagesProvider())
                .setOnSkipClickListener(new OnSkipClickListener(this))
                .build();
        final TutorialFragment tutorialFragment = TutorialFragment.newInstance(tutorialOptions);
        getFragmentManager()
                .beginTransaction()
                .replace(R.id.container, tutorialFragment)
                .commit();    
    }
    

    Just like you've done in your MainActivity.java inside the Sample dir.

    I also added the following code in the above block:

    tutorialFragment.addOnTutorialPageChangeListener(new OnTutorialPageChangeListener() {
            @Override
            public void onPageChanged(int position) {
                Log.d("TAGG","Position: " + position);
            }
        });
    

    to listen to page changes but this is giving me a NullPointerException.

    Caused by: java.lang.NullPointerException
        at com.cleveroad.slidingtutorial.TutorialFragment.addOnTutorialPageChangeListener(TutorialFragment.java:199)
        at spoonmoon.com.m******21.TutorialActivity.replaceTutorialFragment(TutorialActivity.java:73)
    

    Also to mention. Without the pageChangeListener the tutorial is working fine.

    Am I doing anything wrong?

    Reviewed by srujanb at 2017-04-04 09:03
  • 5. What happens when they get to the end of the tutorial?

    On the last slide, how do i get the "Complete" button to appear? There appears to be no way to close the tutorial other than pressing Skip, which is un-intuitive to the user

    Reviewed by broakenmedia at 2016-11-10 16:55
  • 6. java.lang.NullPointerException

    Hi I am getting this error.

    Exception in MessageQueue callback: handleReceiveCallback
    java.lang.NullPointerException: Attempt to read from field 'int android.view.View.mViewFlags' on a null object reference
         at android.view.ViewGroup.canViewReceivePointerEvents(ViewGroup.java:2317)
         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2035)
         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2050)
         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2050)
         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2050)
         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2050)
         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2050)
         at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
         at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2050)
         at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2625)
         at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1770)
         at android.app.Activity.dispatchTouchEvent(Activity.java:2742)
         at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2586)
         at android.view.View.dispatchPointerEvent(View.java:8675)
         at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4129)
         at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3995)
         at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)
         at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3603)
         at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3569)
         at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3686)
         at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3577)
         at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3743)
         at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)
         at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3603)
         at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3569)
         at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3577)
         at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)
         at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5813)
         at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5787)
         at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5758)
         at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5903)
         at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
         at android.os.MessageQueue.nativePollOnce(Native Method)
         at android.os.MessageQueue.next(MessageQueue.java:143)
         at android.os.Looper.loop(Looper.java:122)
         at android.app.ActivityThread.main(ActivityThread.java:5294)
         at java.lang.reflect.Method.invoke(Native Method)
         at java.lang.reflect.Method.invoke(Method.java:372)
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
    
    Reviewed by rafa19 at 2016-10-04 12:14
  • 7. First of all Nice work... I have one problem, How can i make fragment images Clickable? I want to change the fragment on click of any image aslo. For that do i have to modify "PageFragment.java" ? Thank you.

    First of all Nice work... I have one problem, How can i make fragment images Clickable? I want to change the fragment on click of any image aslo. For that do i have to modify "PageFragment.java" ? Thanks you.

    Reviewed by VishalDalve at 2016-09-20 11:18
  • 8. suggestion

    In my APP,I want go to next activity when selecting the last page . This is my code: setUseAutoRemoveTutorialFragment(true) I find the activity,include Tutirual,perform an empty page,rather than liking the skip click events.

    Reviewed by MissMyDearBear at 2016-09-12 03:31
  • 9. Page indicator position

    I didn't find an ability to place indicator on arbitrary place on screen. For example I need to put indicator to top of screen. Please add an ability of layout_gravity for indicators

    Reviewed by paul-ovchinnikov at 2016-09-01 13:47
  • 10. Add findViewById in fragment method of library

    Hello, I want to call the findViewById of an UI Component of my fragment xml... But the tutorialOptions instance return getActivity and getView in null... And I dont have the possibillity of call the findViewById. If you need more information for understand the problem please tell me...

    I hope that you can help me.

    Thanks.

    Example

     public void replaceTutorialFragment() {
            final IndicatorOptions indicatorOptions = IndicatorOptions.newBuilder(this)
                    .build();
            final TutorialOptions tutorialOptions = TutorialFragment.newTutorialOptionsBuilder(this)
                    .setUseAutoRemoveTutorialFragment(true)
                    .setUseInfiniteScroll(true)
                    .setPagesColors(mPagesColors)
                    .setPagesCount(TOTAL_PAGES)
                    .setIndicatorOptions(indicatorOptions)
                    .setTutorialPageProvider(new TutorialPagesProvider())
                    .setOnSkipClickListener(new OnSkipClickListener(this))
                    .build();
            final TutorialFragment tutorialFragment = TutorialFragment.newInstance(tutorialOptions);
            getFragmentManager()
                    .beginTransaction()
                    .replace(R.id.container, tutorialFragment)
                    .commit();
    
    
    
    //This is the test, but tutorialOptions return any options in null
    (ImageView) imgView = (ImageView)tutorialOptions.getActivity().findViewById(R.id.img_view_test);
    
    if(imgView != null){
    
    } 
    }
    
    Reviewed by fabian7593 at 2017-04-25 23:36
  • 11. TutorialSupportFragment.newInstance returns TutorialFragment instead of TutorialSupportFragment

    final TutorialSupportFragment tutorialFragment = TutorialSupportFragment.newInstance(tutorialOptions);

    The compiler throws up an error when using this code

    Reviewed by smabbasdev at 2017-03-29 06:57
  • 12. AndroidX?

    Reviewed by jacobmattsson at 2020-01-09 10:00
  • 13. Using the library

    Couldn't understand how to use it in my own app (creating the tutorial using the lib)... can someone make a video or explain it to a kinda beginner (hi) please? sorry for bothering and thanks in advance!

    Reviewed by NiDaAppDev at 2019-06-17 16:05
  • 14. Attempt to invoke virtual method isMoveOnlyForward() on a null object reference

    Getting this issue. How to fix this? I am implementing Custom Support Fragment. I am using AndroidX.

    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.cleveroad.slidingtutorial.TutorialOptions.isMoveOnlyForward()' on a null object reference

    Reviewed by malwinder-s at 2019-04-29 10:19
  • 15. RTL, Intferface when the user finished the tutorial & completed button

    Added an almost full support in RTL, an Hebrew translation, "Done" button in the last slide & an interface which is called when the user slide the last slide.

    Thanks for making this library, it helped me a lot!

    Reviewed by Frayo44 at 2017-07-18 13:19
Weather-app - Making Weather application using retrofit from api
Weather-app - Making Weather application using retrofit from api

weather-app Motivasyon Hava Durumu uygulamasını api'den retrofit kullanarak yapm

Apr 27, 2022
An Open-Source repository that contains all the Android Dev and Kotlin concepts and several projects on android ranging in difficulty making this repo completely beginner-friendly.
An Open-Source repository that contains all the Android Dev and Kotlin concepts and several projects on android ranging in difficulty making this repo completely beginner-friendly.

An Open-Source repository that contains all the Android Dev and Kotlin concepts and several projects on android ranging in difficulty making this repo completely beginner-friendly. The main aim of this repository is to help students who are learning Android Development or preparing for an Android Developer role-based job.

Jun 17, 2022
The example Android project of animated menu items in toolbar
The example Android project of animated menu items in toolbar

Android Animated Menu Items The example Android project of animated menu items in toolbar. Thanks Srikant Shetty for idea of this animation. Cut: Copy

Jul 4, 2022
Animated dark mode toggle button with Android & Pure Java. ☕

Dark-Toggle-Button Animated dark mode toggle button for Android Java. ☕ converted from kotlin to Java 201 lines: DarkToggleButton.java Android Demo In

Mar 13, 2022
Source code of JekyllEx Android App which can manage your Jekyll blog directly from your Android device!
Source code of JekyllEx Android App which can manage your Jekyll blog directly from your Android device!

JekyllEx Android App Built with ❤︎ by Gourav Khunger ?? Introduction JekyllEx is an Android App that allows you to manage a Jekyll Blog directly from

Aug 10, 2022
Taskify - An app to manage your daily tasks and boost your productivity. Taskify is built using kotlin and follows all modern android Development practices and hence is a good learning resource for beginners
Taskify - An app to manage your daily tasks and boost your productivity. Taskify is built using kotlin and follows all modern android Development practices and hence is a good learning resource for beginners

Taskify Taskify is an app to manage your daily tasks and boost your productivity Video Introduction ?? This is a small introduction video about Taskif

Jul 9, 2022
Aug 14, 2022
ICSx⁵ is an Android app to subscribe to remote or local iCalendar files (like time tables of your school/university or event files of your sports team).

ICSx⁵ ICSx⁵ is an Android app to subscribe to remote Webcal feeds / iCalendar files (like time tables of your school/university or event files of your

Aug 3, 2022
Candash - A simple Android app that turns your phone into an instrument cluster for your Tesla Model 3 and Y
Candash - A simple Android app that turns your phone into an instrument cluster for your Tesla Model 3 and Y

What is CANdash? CANdash is an Android app that turns your Android device into a

Aug 11, 2022
Easy app for managing your files without ads, respecting your privacy & security
Easy app for managing your files without ads, respecting your privacy & security

Simple File Manager Can also be used for browsing root files and SD card content. You can easily rename, copy, move, delete and share anything you wis

Aug 15, 2022
when you use restful api and network get disconnect you have to store your data local for make your app faster and work on ofline mode

AppArchitectureOflineMode when you use restful api and network get disconnect you have to store your data local for make your app faster and work on o

Jun 20, 2021
Alkatraz is an app that helps you to Reach your goals by managing your Habits .
Alkatraz is an app that helps you to Reach your goals by managing your Habits .

Alkatraz - Build healthy habits for healthy life Alkatraz is an app that helps you to Reach your goals by managing your Habits . It's makes your life

May 19, 2022
With this simple app, you can keep track of your favourite cryptocurrency on your wrist.
With this simple app, you can keep track of your favourite cryptocurrency on your wrist.

Capstone project crypto Tracker ?? Final Product (05-06) V1.1 "somebody toucha my spaghet" feature set State Note Track the current price of a crypto

Jun 29, 2022
Manage your torrents from your Android device with Transdroid.
Manage your torrents from your Android device with Transdroid.

All popular clients are supported: µTorrent, Transmission, rTorrent, Vuze, Deluge, BitTorrent 6, qBittorrent, and many more. You can view and manage running torrents and individual files. Adding is easy via the integrated search or RSS feeds (full version required). Monitor progress using the home screen widget or background alarm service.

Aug 6, 2022
Tournant is a Gourmand/Gourmet recipe parser which serves your dishes on your Android device

Tournant Gourmand/Gourmet recipe parser Website: tournant.zimbelstern.eu Tournant serves your favorite dishes on your Android device! With Tournant, y

Aug 14, 2022
Share your minecraft-adventure with your friends in nation-party.

Nation Party Make your adventure as shared with your friends and family in Nation Party. Features * Create your own party with your own name; * Invite

Jan 9, 2022
Synth is CRED's inbuilt library for using Neumorphic components in your app.
Synth is CRED's inbuilt library for using Neumorphic components in your app.

Synth Synth is CRED's inbuilt library for using Neumorphic components in your app. What really is Neumorphism? It's an impressionistic style, playing

Aug 9, 2022
The SleepQualityTracker app - a demo app that helps you collect information about your sleep
The SleepQualityTracker app - a demo app that helps you collect information about your sleep

The SleepQualityTracker app is a demo app that helps you collect information about your sleep. This app builds on the SleepQualityTracker previous made, refactoring the code to make it more efficient so it will be easier to maintain and test

Apr 1, 2022