ishandutta2007
ishandutta2007

Reputation: 18194

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**
 }

Upvotes: 1

Views: 51

Answers (2)

Sandip Fichadiya
Sandip Fichadiya

Reputation: 3480

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();

 }

Upvotes: 2

Andy Joyce
Andy Joyce

Reputation: 2832

You can get the current fragment by calling getItem() with the current position on your adapter like this

    public void myonclickmethod() {
       Fragment fragment = adapter.getItem(viewpager.getCurrentItem())
}

Upvotes: 1

Related Questions