1

My host activity has a viewpager with two fragments A and B.My activity code looks like this:

public class MainActivity extends AppCompatActivity implements
        OnDataLoadedListener {

    private ViewPager pager;
    private MyPagerAdapter adapter;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pager = (ViewPager) findViewById(R.id.pager);
        adapter = new MyPagerAdapter(getSupportFragmentManager());
        pager.setAdapter(adapter);

        final int pageMargin = (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, 4, getResources()
                        .getDisplayMetrics());
        pager.setPageMargin(pageMargin);
        tabLayout.setupWithViewPager(pager);
}


public class MyPagerAdapter extends FragmentPagerAdapter {

        private final String[] TITLES = { "A",
                "B" };

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

        @Override
        public CharSequence getPageTitle(int position) {
            return TITLES[position];
        }

        @Override
        public int getCount() {
            return TITLES.length;
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {

            case 0:
                return A.getInstance();
            case 1:
                return B.getInstance();
            }
            return null;
        }

    }

public Fragment findFragmentByPosition(int position) {
        return getSupportFragmentManager().findFragmentByTag(
                "android:switcher:" + pager.getId() + ":"
                        + adapter.getItemId(position));
    }

Now when activity start viewpager get populated with fragment properly and I try to access fragmentby using following code:

if (AFragment == null)
    AFragment = (A) findFragmentByPosition(0);
if (BFragment == null)
    BFragment = (B) findFragmentByPosition(1);

But AFragment and BFragment always contains null.I have read other simmilar question but it didn't help either.I need access to fragments as I want to call some methods defined in fragment from host activity.

Code to get an instance of fragment:

public static AFragment getInstance() {
        AFragment fragment = new AFragment();
        return fragment;
    }
Community
  • 1
  • 1
Ansh
  • 2,366
  • 3
  • 31
  • 51

1 Answers1

0

I'm think that the problem is that you need to move the method to the Adapter, because you need the original instance of the FragmentManager :

 public class MyPagerAdapter  extends FragmentPagerAdapter {

FragmentManager fm;

private final String[] TITLES = { "A",
        "B" };

public MyPagerAdapter (FragmentManager fm) {
    super(fm);
    this.fm = fm;
}

@Override
public CharSequence getPageTitle(int position) {
    return TITLES[position];
}

@Override
public int getCount() {
    return TITLES.length;
}

@Override
public Fragment getItem(int position) {
    switch (position) {

        case 0:
            return A.getInstance();
        case 1:
            return B.getInstance();
    }
    return null;
}



public Fragment findFragmentByPosition(int position, int pagerId) {
    return fm.findFragmentByTag(
            "android:switcher:" + pagerId + ":"
                    + getItemId(position));
}
}

So now you can call:

 adapter.findFragmentByPosition(position, pager.getId());
yshahak
  • 4,996
  • 1
  • 31
  • 37