GithubHelp home page GithubHelp logo

cleveroad / slidingtutorial-android Goto Github PK

View Code? Open in Web Editor NEW
2.5K 105.0 377.0 6.17 MB

Android Library for making animated tutorials inside your app

Home Page: https://www.cleveroad.com/

License: MIT License

Java 100.00%

slidingtutorial-android's Introduction

##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.

slidingtutorial-android's People

Contributors

alexeypodolian avatar davinctor avatar ilchenko-peter avatar iojjj avatar jekaua avatar vadimhalimendikcr avatar valeryges avatar yatsinskiycr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

slidingtutorial-android's Issues

Exception in ViewPager

Hi !

I found a bug when you swipe fast between the view 0 and 1 or N and N-1. It seems that the ViewPager change the size of the list of pages from 3 to 2 when the ViewPager is at position 0 and N.
If you switch fast to position 1, it's like ViewPager has a size of 2 in extremity then it tries to access to the position 2 (load the neighboor pages) and crashes.

There is the exception :

11-16 17:43:13.121 19447-19447/ch.gookers.buyer E/InputEventReceiver: Exception dispatching input event.
11-16 17:43:13.131 19447-19447/ch.gookers.buyer E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
11-16 17:43:13.151 19447-19447/ch.gookers.buyer E/MessageQueue-JNI: 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:832)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2424)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2839)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2456)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2839)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2456)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2839)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2456)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2839)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2456)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2839)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2456)
at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2831)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1863)
at android.app.Activity.dispatchTouchEvent(Activity.java:3046)
at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2792)
at android.view.View.dispatchPointerEvent(View.java:10228)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5344)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5180)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4620)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4673)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4639)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4781)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4647)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4838)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4620)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4673)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4639)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4647)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4620)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7306)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7184)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7145)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7416)
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:143)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

My values in array.xml

        <item>@string/boarding_title_1</item>
        <item>@string/boarding_title_2</item>
        <item>@string/boarding_title_3</item>
        <item>@string/boarding_title_4</item>
    </string-array>
    <string-array name="boarding_text">
        <item>@string/boarding_text_1</item>
        <item>@string/boarding_text_2</item>
        <item>@string/boarding_text_3</item>
        <item>@string/boarding_text_4</item>
    </string-array>
    <integer-array name="boarding_picture">
        <item>@drawable/boarding_1</item>
        <item>@drawable/boarding_2</item>
        <item>@drawable/boarding_3</item>
        <item>@drawable/boarding_4</item>
    </integer-array>

My tutorial fragment

public class BoardingTutorialFragment extends TutorialFragment {

    private static final int TOTAL_PAGES = 4;
    private Map<Integer, Fragment> fragments = new HashMap<>();

    private final TutorialPageProvider<Fragment> mTutorialPageProvider = new TutorialPageProvider<Fragment>() {
        @NonNull
        @Override
        public Fragment providePage(int position) {
            if (fragments.get(Integer.valueOf(position)) == null)
                fragments.put(Integer.valueOf(position), BoardingFragment.getFragment(position));
            return fragments.get(Integer.valueOf(position));
        }
    };

    @Override
    protected TutorialOptions provideTutorialOptions() {
        return newTutorialOptionsBuilder(this.getActivity())
                .setPagesCount(TOTAL_PAGES)
                .setTutorialPageProvider(mTutorialPageProvider)
                .build();
    }
}

My page fragment

public class BoardingFragment extends PageFragment {
    private static final String TAG = "BoardingFragment";
    private static final String POSITION = "ch.gookers.buyer.views.boarding.position";

    private int position = 0;

    @BindView(R.id.boarding_image)
    protected ImageView ivImage;

    @BindView(R.id.boarding_title)
    protected TextView tvTitle;

    @BindView(R.id.boarding_text)
    protected TextView tvText;

    public static Fragment getFragment(int position) {
        Fragment fragment = new BoardingFragment();
        Bundle args = new Bundle();
        args.putInt(POSITION, position);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle args = getArguments();
        if (args != null)
            position = args.getInt(POSITION);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ButterKnife.bind(this, view);
        setImage();
        setTitle();
        setText();
        Log.d(TAG, "VIEW CREATED");
    }

    private void setImage(){
        TypedArray pictures = getResources().obtainTypedArray(R.array.boarding_picture);
        Picasso.with(getActivity()).load(pictures.getResourceId(position, -1)).into(ivImage);
        pictures.recycle();
    }

    private void setTitle(){
        Log.d(TAG, "Position = "+position);
        String[] titles = getResources().getStringArray(R.array.boarding_title);
        Log.d(TAG, "titles size = "+titles.length);
        tvTitle.setText(titles[position]);
    }

    private void setText(){
        Log.d(TAG, "Position = "+position);
        String[] texts = getResources().getStringArray(R.array.boarding_text);
        Log.d(TAG, "texts size = "+texts.length);
        tvText.setText(texts[position]);
    }

    @Override
    protected int getLayoutResId() {
        Log.d(TAG, "getLayoutResId");
        return R.layout.boarding_fragment_layout;
    }

    @NonNull
    @Override
    protected TransformItem[] getTransformItems() {
        return new TransformItem[]{
                // TransformItem.create(view for transform, moving direction, shift coefficient)
                TransformItem.create(R.id.boarding_image, Direction.LEFT_TO_RIGHT, 0),
                TransformItem.create(R.id.boarding_title, Direction.LEFT_TO_RIGHT, 0),
                TransformItem.create(R.id.boarding_text, Direction.LEFT_TO_RIGHT, 0)
        };
    }
}

Use with android.app.Fragment

Hi,

I would really like to use this library, but i'm using android.app.Fragment instead of the android.support.v4.app.Fragment used by this library. Is it possible to use this library with android.app.Fragment?

Provide in skip button click listener

Hi,

first of all awesome and clean library. I really like it and I prefer it over other libraries due to the fact, that you provide fragments instead of activities. Anyway there is no possibility of listening to the skip button click. Usually you want your own code to run instead of all the fragments are removed. I have something in mind like

@Override onSkipClicked(View view) {
  //your custom code here
}

Thanks for any feedback on this.

Best regards
dasheck

Hidding 'Skip' button

Is there a way to hide the skip button? My app doesn't need it. Thanks for the awesome lib!

How I can create another button to go to next page?

Hi, I've done the skip button with:

public void skipTutorial(){
        Intent intent = new Intent();
        getActivity().setResult(Activity.RESULT_OK, intent);
        getActivity().finish();
    }

but with Next Page I don't know how to do it. Thank you.

Enhance ViewPager with "disable paging" functionality

This is an enhancement. I had to include whole library sources into my project just to add these 2-3 lines..

I don't wanna bother with making forks and pull requests for this tiny change, so I'll just include you my sources here (this should go inside view pager class):

private boolean enabled = true;

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    if (getAdapter() == null || getAdapter().getCount() == 0 || !enabled) {
        return false;
    }
    return super.onInterceptTouchEvent(event);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    if (getAdapter() == null || getAdapter().getCount() == 0 || !enabled) {
        return false;
    }
    return super.onTouchEvent(ev);
}

public void setPagingEnabled(boolean enabled) {
    this.enabled = enabled;
}

But all in all, it's an awesome lib guys, congratulations, it would also be awesome to add Direction.TOP and Direction.BOTTOM, just a suggestion.. Cheers.

Page background invisible unless white?

Not sure what should be happening here. On the linear layout for my pages i've set a background image, with icons on top that i intend on animating. For some reason the background is always removed and only the icons remain. EXCEPT if i make the background #ffffff at which point it is visible

How to solve manifest merger failed

the error info :

Error:Execution failed for task ':lib:processDebugAndroidTestManifest'.
java.lang.RuntimeException: Manifest merger failed : Attribute application@label 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

Add more than 3 PageFragements

Hi, we want to add more than 3 page fragments to your sliding, but after that, when the slider starts, it doesn't start on the first viewpager.
How can it be solved?

Thank you,

Sérgio

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)

I want to use PresentationPagerFragment without emptyFragment

Here's PresentationAdapter's code:

    private class PresentationAdapter extends FragmentPagerAdapter {
        private final Fragment emptyFragment = new Fragment();

        public PresentationAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            if (isInfiniteScrollEnabled()) {
                position %= getPagesCount();
            }
            if (position < getPagesCount()) {
                return getPage(position);
            } else if (position == getPagesCount()) {
                return emptyFragment;
            } else {
                throw new IllegalArgumentException("Invalid position: " + position);
            }
        }

        @Override
        public int getCount() {
            if (getPagesCount() == 0)
                return 0;
            if (isInfiniteScrollEnabled())
                return Integer.MAX_VALUE;
            return getPagesCount() + 1;
        }
    }

I don't want to emptyFragment on last page.
Why do I forced to be used PresentationAdapter?
So I changed adapter after initliazing, but I felt inefficient.

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){

} 
}

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?

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.

NullPointerException crash in getCount

Hello,

There is a crash that occurs randomly from devices and I see it on Crashlytics.

Caused by java.lang.NullPointerException

Attempt to invoke virtual method 'int com.cleveroad.slidingtutorial.q.c()' on a null object reference

com.cleveroad.slidingtutorial.TutorialImpl$TutorialAdapterImpl.getCount (TutorialImpl.java:281)
com.cleveroad.slidingtutorial.TutorialSupportFragment$TutorialAdapter.getCount (TutorialSupportFragment.java:285)
android.support.v4.view.ViewPager.setAdapter (ViewPager.java:526)
com.cleveroad.slidingtutorial.TutorialImpl.onViewCreated (TutorialImpl.java:97)
com.cleveroad.slidingtutorial.TutorialSupportFragment.onViewCreated (TutorialSupportFragment.java:146)
android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1439)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:832)

Remove last empty fragment

Hi guys,

First of all, thank you for this awesome lib !

Just one question : how can I remove the empty fragment at the end of the scroll ?

Thanks

support for save instance state

AndroidRuntime: FATAL EXCEPTION: main
AndroidRuntime: Process: com.cleveroad.tutorialsample, PID: 26152
AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.cleveroad.tutorialsample/com.cleveroad.slidingtutorial.sample.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.cleveroad.slidingtutorial.TutorialOptions.getPagesCount()' on a null object reference
AndroidRuntime:        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2316)
AndroidRuntime:        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2376)
AndroidRuntime:        at android.app.ActivityThread.access$800(ActivityThread.java:147)
AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281)
AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:102)
AndroidRuntime:        at android.os.Looper.loop(Looper.java:135)
AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:5253)
AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
AndroidRuntime:        at java.lang.reflect.Method.invoke(Method.java:372)
AndroidRuntime:        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.cleveroad.slidingtutorial.TutorialOptions.getPagesCount()' on a null object reference
AndroidRuntime:        at com.cleveroad.slidingtutorial.TutorialImpl$TutorialAdapterImpl.getCount(TutorialImpl.java:281)
AndroidRuntime:        at com.cleveroad.slidingtutorial.TutorialFragment$TutorialAdapter.getCount(TutorialFragment.java:292)
AndroidRuntime:        at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:526)
AndroidRuntime:        at com.cleveroad.slidingtutorial.TutorialImpl.onViewCreated(TutorialImpl.java:97)
AndroidRuntime:        at com.cleveroad.slidingtutorial.TutorialFragment.onViewCreated(TutorialFragment.java:152)
AndroidRuntime:        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:908)
AndroidRuntime:        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
AndroidRuntime:        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1049)
AndroidRuntime:        at android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1869)
AndroidRuntime:        at android.app.Activity.performCreateCommon(Activity.java:5970)
AndroidRuntime:        at android.app.Activity.performCreate(Activity.java:5977)
AndroidRuntime:        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
AndroidRuntime:        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
AndroidRuntime:        ... 10 more

just enable "don't keep activities" and try minimize/maximize sample app

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)

How listen end of slide show ?

I wonder how to listen the end of the slides-set. Is there any event, method to override ?
I want to close the activity when the slide is done !

Error:(2) Attribute "radius" has already been defined

First of all thanks for creating this awesome stuff
i encountered this error while trying to compile
Error:(2) Attribute "radius" has already been defined

i already google and it's looks like another library i used already defined that attribute radius.
is there anything i could do to fix that? thanks in advance

TutorialPageIndicator is not show

<com.cleveroad.slidingtutorial.TutorialPageIndicator
android:id="@+id/indicator"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
OR
<com.cleveroad.slidingtutorial.TutorialPageIndicator
android:id="@+id/indicator"
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_gravity="center"/>

Setting:
newTutorialOptionsBuilder(getContext())
.setUseInfiniteScroll(true)
.setPagesColors(pagesColors)
.setPagesCount(TOTAL_PAGES)
.setTutorialPageProvider(mTutorialPageOptionsProvider)
.setIndicatorOptions(IndicatorOptions.newBuilder(getContext())
.setElementSizeRes(R.dimen.indicator_size)
.setElementSpacingRes(R.dimen.indicator_spacing)
.setElementColorRes(android.R.color.darker_gray)
.setSelectedElementColor(Color.LTGRAY)
.setRenderer(DrawableRenderer.create(getActivity()))
.build())
.onSkipClickListener(mOnSkipClickListener)
//.setTutorialPageProvider(mTutorialPageProvider)
.build();

I dont know why ,Other code is the same as Demo, but it is not shown. I feel its height has been 0dp, so it is not shown

java.lang.NullPointerException: Attempt to get length of null array at com.cleveroad.slidingtutorial.PageImpl.onDestroyView

Question on StackOverflow http://stackoverflow.com/questions/43987164/unable-to-destroy-activity-with-slidingtutorial-library

NullPointerException for chess.vendo java.lang.NullPointerException: Attempt to get length of null array at com.cleveroad.slidingtutorial.PageImpl.onDestroyView(PageImpl.java:71) at com.cleveroad.slidingtutorial.PageFragment.onDestroyView(PageFragment.java:73) at android.app.Fragment.performDestroyView(Fragment.java:2570) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1061) at android.app.FragmentManagerImpl.detachFragment(FragmentManager.java:1351) at android.app.BackStackRecord.run(BackStackRecord.java:798) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1580) at android.app.FragmentManagerImpl$1.run(FragmentManager.java:483) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)

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

java.lang.NullPointerException: Attempt to get length of null array

java.lang.NullPointerException: Attempt to get length of null array at com.cleveroad.slidingtutorial.PageImpl.onDestroyView(PageImpl.java:71) at com.cleveroad.slidingtutorial.PageFragment.onDestroyView(PageFragment.java:73) at android.app.Fragment.performDestroyView(Fragment.java:2570) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1061) at android.app.FragmentManagerImpl.detachFragment(FragmentManager.java:1351) at android.app.BackStackRecord.run(BackStackRecord.java:798) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1580) at android.app.FragmentManagerImpl$1.run(FragmentManager.java:483) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)

stack overflow question http://stackoverflow.com/questions/43987164/unable-to-destroy-activity-with-slidingtutorial-library

What is the point of Direction.LEFT_TO_RIGHT?

Sorry for stupid question, but in the sample app provided I change Direction.LEFT_TO_RIGHT to Direction.RIGHT_TO_LEFT, I found nothing changed. Is there any subtle differences between the two?

Skip button language

Hello there,

I actually can't find a way to custom/remove the "Skip" button, like changing the language according to my app.
Any update comming soon ?

EDIT:
Appear to be really easy finally, juste override onViewCreated in my TutorialSupportFragment

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    View skipButton = view.findViewById(R.id.tvSkip);
    skipButton.setVisibility(View.INVISIBLE);
}

Elliot.

Translation animations are not working in the sample project

I've run the sample project on Nexus 5X Android 6.0.1 with currently latest stable Android Studio, and translation animations are not working. I've also tried implementing the samples into my project and animations don't work there either.

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?

java.lang.IndexOutOfBoundsException

Hi, running the sample of SlidingTutorial into my app, sometimes (not always¿?) I get this error when I slide to the second page:

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:800)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2023)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2350)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2040)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2350)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2040)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2350)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2040)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2350)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2040)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2350)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2040)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2350)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2040)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2350)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2040)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2350)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2040)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2216)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1563)
at android.app.Activity.dispatchTouchEvent(Activity.java:2547)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:63)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2164)
at android.view.View.dispatchPointerEvent(View.java:8003)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4221)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4100)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3658)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3712)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3681)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3792)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3689)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3849)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3658)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3712)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3681)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3689)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3658)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5925)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5874)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5845)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6005)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:138)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:5584)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
at dalvik.system.NativeStart.main(Native Method)

where can be the problem?

thanks

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.