Search code examples
androidandroid-fragmentsandroid-viewpager

Access instance of currently viewed fragment attached using viewpager


I have implemented swipe fragments using https://developer.android.com/training/animation/screen-slide.html or https://developer.android.com/training/implementing-navigation/lateral.html

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/some_background_fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

    <android.support.v4.view.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</RelativeLayout>

Here is MyActivity.java:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_overlay);

        // Instantiate a ViewPager and a PagerAdapter.
        mPager = findViewById(R.id.pager);
        mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        mPager.setAdapter(mPagerAdapter);
        mPager.setCurrentItem(1);
    }
    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter{
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            if (position == 0)
                return new Page0Fragment();
            else
                return new Page1Fragment();
        }

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

Now I am trying to access the currently viewed fragment like this

 public void myonclickmethod(View view) {
    FragmentManager fm = getSupportFragmentManager();       
    fragment = fm.findFragmentById(R.id.pager);//<=**This is coming as instance of Page0Fragment inspite of me intializing the activity with Page1Fragment and also currently standing on Page1Fragment without any swiping**
 }

Solution

  • First, you need to change your ScreenSlidePagerAdapter to return the same instance everytime instead of new Page0Fragment like:

        private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter{
                List<Fragment> fragments = new ArrayList<>();
                public ScreenSlidePagerAdapter(FragmentManager fm) {
                    super(fm);
                    fragments.add(new Page0Fragment());
                    fragments.add(new Page1Fragment());
                }
    
                @Override
                public Fragment getItem(int position) {
                    return fragments.get(position);
                }
    
                @Override
                public int getCount() {
                    return fragments.size();
                }
    

    Now for getting visible fragment, do like:

    public void myonclickmethod(View view) {
        int currentPosition = mPager.getCurrentItem();
        if(currentPosition == 0 {
            Page0Fragment page0Fragment = (Page0Fragment)mPagerAdapter.getItem(currentPosition);
            page0Fragment.doSomething();
        } else {
            Page1Fragment page1Fragment =(Page1Fragment)mPagerAdapter.getItem(currentPosition);
           pag1Fragment.doSomething();
    
     }