AppIntro: addSlide IndexOutOfBoundsException on Android 7

AppIntro Version: 5.1.0

Device/Android Version: Huawei P9 Plus / Android 7.0

Issue details / Repro steps / Use case background: The tutorial slides load sucessfully and the first video is played but when I want to go to the next video it crashes with the exception shown below. This only happens on Android 7. On a Samsung S10 with Android 10 it works fine.

Your Code:

public class TutorialActivity extends AppIntro {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Note here that we DO NOT use setContentView();

        boolean full = getIntent().getBooleanExtra("full", true);

        // Add your slide fragments here.
        // AppIntro will automatically generate the dots indicator and buttons.
        if (full) {
            addSlide(TutorialFragment.newInstance("1. Keyboard", R.raw.keyboard));
            addSlide(TutorialFragment.newInstance("2. Self-Reports", R.raw.self_report));
            addSlide(TutorialFragment.newInstance("2.1. Example 1", R.raw.example1));
            addSlide(TutorialFragment.newInstance("2.2. Example 2", R.raw.example2));
            addSlide(TutorialFragment.newInstance("2.3. Example 3", R.raw.example3));
            addSlide(TutorialFragment.newInstance("2.4. Example 4", R.raw.example4));
            addSlide(TutorialFragment.newInstance("3. App", R.raw.app));
        } else {
            addSlide(TutorialFragment.newInstance("Definition", R.raw.self_report));
            addSlide(TutorialFragment.newInstance("Example 1", R.raw.example1));
            addSlide(TutorialFragment.newInstance("Example 2", R.raw.example2));
            addSlide(TutorialFragment.newInstance("Example 3", R.raw.example3));
            addSlide(TutorialFragment.newInstance("Example 4", R.raw.example4));
        }

        // Set Background color
        setBarColor(Color.parseColor("#0069B4"));
        setSeparatorColor(Color.parseColor("#0069B4"));

        // Show Skip button
        showSkipButton(true);

        // Show how far progress is
        setProgressButtonEnabled(true);

        // Don't Turn vibration on
        setVibrate(false);

        // Set animation for changing fragment
        setZoomAnimation();
    }

    @Override
    public void onSkipPressed(Fragment currentFragment) {
        super.onSkipPressed(currentFragment);

        finishTutorial();
    }

    @Override
    public void onDonePressed(Fragment currentFragment) {
        super.onDonePressed(currentFragment);

        finishTutorial();
    }

    @Override
    public void onSlideChanged(@Nullable Fragment oldFragment, @Nullable Fragment newFragment) {
        super.onSlideChanged(oldFragment, newFragment);

        if(newFragment instanceof TutorialFragment) {
            ((TutorialFragment) newFragment).startVideo();
        }
        if(oldFragment instanceof TutorialFragment) {
            ((TutorialFragment) oldFragment).stopVideo();
        }
    }

    /**
     * Closes the Tutorial activity
     *
     */
    private void finishTutorial() {
        finish();
    }
}

public class TutorialFragment extends Fragment {

    private static final String EXTRA_TITLE = "extra_title";
    public static final String EXTRA_VIDEO = "extra_video";

    private VideoView mVideoView;

    public static final TutorialFragment newInstance(String title, int videoId) {
        // Load tutorial data
        TutorialFragment f = new TutorialFragment();
        Bundle bd = new Bundle(2);
        bd.putString(EXTRA_TITLE, title);
        bd.putInt(EXTRA_VIDEO, videoId);
        f.setArguments(bd);
        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_tutorial, container, false);

        // Set tutorial title
        TextView title = rootView.findViewById(R.id.tutorial_title);
        title.setText(getArguments().getString(EXTRA_TITLE));

        // Set tutorial video
        mVideoView = rootView.findViewById(R.id.tutorial_video);

        // Load video file
        String path = "android.resource://" + getContext().getPackageName() + "/" + getArguments().getInt(EXTRA_VIDEO);
        Uri uri= Uri.parse(path);

        // Set video parameters
        mVideoView.setMediaController(null);
        mVideoView.setVideoURI(uri);
        mVideoView.requestFocus();

        return rootView;
    }

    /**
     * Start running the video
     *
     */
    public void startVideo() {
        mVideoView.start();
        mVideoView.seekTo(0);
    }

    /**
     * Stops running the video
     *
     */
    public void stopVideo() {
        mVideoView.stopPlayback();
    }
}

Stack trace / LogCat:

java.lang.IndexOutOfBoundsException: Index: 2, Size: 2

--------- Stack trace ---------

    java.util.ArrayList.get(ArrayList.java:411)
    androidx.viewpager.widget.ViewPager.getChildDrawingOrder(ViewPager.java:804)
    android.view.View.populateAccessibilityNodeInfoDrawingOrderInParent(View.java:7010)
    android.view.View.onInitializeAccessibilityNodeInfoInternal(View.java:6969)
    android.view.View.onInitializeAccessibilityNodeInfo(View.java:6584)
    android.view.View.createAccessibilityNodeInfoInternal(View.java:6543)
    android.view.View.createAccessibilityNodeInfo(View.java:6528)
    android.view.accessibility.AccessibilityRecord.setSource(AccessibilityRecord.java:145)
    android.view.accessibility.AccessibilityRecord.setSource(AccessibilityRecord.java:119)
    android.view.View.onInitializeAccessibilityEventInternal(View.java:6480)
    android.view.View.onInitializeAccessibilityEvent(View.java:6468)
    android.view.View.sendAccessibilityEventUncheckedInternal(View.java:6329)
    android.view.View.sendAccessibilityEventUnchecked(View.java:6314)
    android.view.View$SendViewStateChangedAccessibilityEvent.run(View.java:23705)
    android.view.View$SendViewStateChangedAccessibilityEvent.runOrPost(View.java:23738)
    android.view.View.notifyViewAccessibilityStateChangedIfNeeded(View.java:9476)
    android.view.View.onFocusChanged(View.java:6197)
    android.view.View.clearFocusInternal(View.java:6101)
    android.view.View.unFocus(View.java:6134)
    android.view.ViewGroup.unFocus(ViewGroup.java:997)
    android.view.ViewGroup.unFocus(ViewGroup.java:997)
    android.view.ViewGroup.unFocus(ViewGroup.java:997)
    android.view.ViewGroup.requestChildFocus(ViewGroup.java:734)
    android.view.ViewGroup.addViewInner(ViewGroup.java:4503)
    android.view.ViewGroup.addView(ViewGroup.java:4312)
    androidx.viewpager.widget.ViewPager.addView(ViewPager.java:1485)
    android.view.ViewGroup.addView(ViewGroup.java:4252)
    android.view.ViewGroup.addView(ViewGroup.java:4225)
    androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:326)
    androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
    androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
    androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
    androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
    androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:447)
    androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2169)
    androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1992)
    androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1947)
    androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1818)
    androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:303)
    androidx.fragment.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:246)
    androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
    androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:669)
    androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:631)
    androidx.viewpager.widget.ViewPager.setCurrentItem(ViewPager.java:612)
    com.github.paolorotolo.appintro.AppIntroViewPager.setCurrentItem(AppIntroViewPager.java:84)
    com.github.paolorotolo.appintro.AppIntroViewPager.goToNextSlide(AppIntroViewPager.java:47)
    com.github.paolorotolo.appintro.AppIntroBase.changeSlide(AppIntroBase.java:965)
    com.github.paolorotolo.appintro.AppIntroBase.access$300(AppIntroBase.java:41)
    com.github.paolorotolo.appintro.AppIntroBase$NextButtonOnClickListener.onClick(AppIntroBase.java:1059)
    android.view.View.performClick(View.java:5646)
    android.view.View$PerformClick.run(View.java:22459)
    android.os.Handler.handleCallback(Handler.java:761)
    android.os.Handler.dispatchMessage(Handler.java:98)
    android.os.Looper.loop(Looper.java:156)
    android.app.ActivityThread.main(ActivityThread.java:6523)
    java.lang.reflect.Method.invoke(Native Method)
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Reactions: 1
  • Comments: 19 (10 by maintainers)

Most upvoted comments

Hey,

we’ve also had this issue.

E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
        at java.util.ArrayList.get(ArrayList.java:437)
        at com.github.appintro.internal.viewpager.PagerAdapter.getItem(PagerAdapter.kt:13)
        at com.github.appintro.AppIntroBase$onPostCreate$1.run(AppIntroBase.kt:458)
        at android.os.Handler.handleCallback(Handler.java:869)
        at android.os.Handler.dispatchMessage(Handler.java:101)
        at android.os.Looper.loop(Looper.java:206)
        at android.app.ActivityThread.main(ActivityThread.java:6749)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:845)

I can reproduce this by not adding any slides in onCreate.

It’s version 6.0.0.