Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sliding between fragments

I'm developing an app and currently I am trying to add ScreenSlide to it. I managed to do this using a tutorial, but usual sliding between x pages is not quite what I'm looking for.

With code provided below I can slide between 5 pages, but pages aligned in a straight line and you can't go from first page straight to 5th and vise versa. In my app I have 4 pages. When I slide left I switch between first 2 pages, when I slide right I switch between 2 last pages. On image below you can see how my current code switches page and under it - my goal.

enter image description here

    public class MainActivity extends FragmentActivity {
    private static final int NUM_PAGES = 5;


    private ViewPager mPager;
    private ScreenSlidePageFragment[] pages = new ScreenSlidePageFragment[NUM_PAGES];


    private PagerAdapter mPagerAdapter;

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

        mPager = (ViewPager) findViewById(R.id.pager);
        mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        mPager.setAdapter(mPagerAdapter);

    }

    @Override
    public void onBackPressed() {
        if (mPager.getCurrentItem() == 0) {
            super.onBackPressed();
        } else {
            mPager.setCurrentItem(mPager.getCurrentItem() - 1);
        } 
    }

    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }



        @Override
        public int getCount() {
            return NUM_PAGES;
        }

        @Override
        public Fragment getItem(int position) {
            boolean moveRight = mPager.getCurrentItem() < position;
            boolean moveLeft = mPager.getCurrentItem() > position;
            switch(position){
                case 5: 
                    if(moveRight){

                        return geLog.w("i"
                            + "Info", Integer.toString(position));
                       //return getPageByPosition(2);
                    if(moveLeft)
                        return getPageByPosition(2);


            }
            return new ScreenSlidePageFragment();
        }

        private Fragment getPageByPosition(int position){
            int index = position - 1;
            if(index < 0 || index > NUM_PAGES-1)
                throw new InvalidParameterException("requested position is invalid");

            if(pages[index] == null)
                pages[index] = new ScreenSlidePageFragment();
            return pages[index]; 
        }

    }


}

[UPDATE]

I've managed to write a code that allows me to infinitely slide to the right between 6 different pages. Left side is limited though - I can slide only to the first page(so if I'm on 1st page after I cycled 3 times to the right, I can make only 3 cycles backwards). I think I am very close to finding the solution. Any ideas?

MainActivity.java

    public class MainActivity extends FragmentActivity  {

private static final int NUM_PAGES = 6;
private ViewPager pager;
private PagerAdapter pagerAdapter;
private List<ScreenSlidePageFragment> slideList;

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

    slideList = new ArrayList<ScreenSlidePageFragment>();
    for (int i = 0; i<NUM_PAGES; i++){
        ScreenSlidePageFragment slide = new ScreenSlidePageFragment();
        slide.setIndex(i+1);
        slideList.add(slide);
    }

    pager = (ViewPager) findViewById(R.id.pager);
    pagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
    pager.setAdapter(pagerAdapter);
}

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {

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

    @Override
    public Fragment getItem(int position) {
        int _pos = position % NUM_PAGES;
        return slideList.get(_pos);
    }

    @Override
    public int getCount() {
        return Integer.MAX_VALUE;
    }
}
}

ScreenSlidePageFragment.java

  public class ScreenSlidePageFragment extends Fragment {


        private int index;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            ViewGroup root = (ViewGroup)inflater.inflate(R.layout.slide, container, false);
            TextView tw = (TextView) root.findViewById(R.id.textView);
            tw.setText(Integer.toString(index));
            return root;
        }

        public void setIndex(int index){
            this.index = index;
        }
        }
like image 670
Oleksandr Firsov Avatar asked Sep 24 '15 16:09

Oleksandr Firsov


People also ask

What is difference between ViewPager and ViewPager2?

ViewPager2 is an improved version of the ViewPager library that offers enhanced functionality and addresses common difficulties with using ViewPager . If your app already uses ViewPager , read this page to learn more about migrating to ViewPager2 .

How do you animate fragment transitions?

At a high level, here's how to make a fragment transition with shared elements: Assign a unique transition name to each shared element view. Add shared element views and transition names to the FragmentTransaction . Set a shared element transition animation.

What is a fragment activity?

A Fragment represents a reusable portion of your app's UI. A fragment defines and manages its own layout, has its own lifecycle, and can handle its own input events. Fragments cannot live on their own--they must be hosted by an activity or another fragment.


1 Answers

One possible workaround is not using viewpager, but creating your own custom Slider, I ended up with this solution, since ViewPager is very unflexible, like for example if you try to do something like Facebook Page app kind of thing. Cons: you have to manage all the touches and lifecycle.

Another simpler solution for this is basically use the following API if I understand the question correctly it should be enough. ViewPager.setCurrentItem

like image 150
Iliiaz Akhmedov Avatar answered Nov 14 '22 09:11

Iliiaz Akhmedov