How to get elements of fragments created by ViewPager in MainActivity?
Unfortunately the only "safe" way to do it is to check the source code of FragmentPagerAdapter
, and see what tag
is the fragment is added with - because findFragmentByTag
is the only safe way to get a Fragment from a FragmentManager.
Of course, we need to hope that this implementation detail doesn't change between support library versions, but it actually hasn't changed in years :)
Anyways, so FragmentPagerAdapter says:
// Do we already have this fragment? String name = makeFragmentName(container.getId(), itemId); Fragment fragment = mFragmentManager.findFragmentByTag(name);
So what is name
?
private static String makeFragmentName(int viewId, long id) { return "android:switcher:" + viewId + ":" + id; }
What is viewId
and what is id
?
ViewId is container.getId()
, where container
is the ViewPager
itself.
id
is: final long itemId = getItemId(position);
which by default is return position;
.
So you can find the Fragment as follows:
Fragment fragment = fragmentManager.findFragmentByTag("android:switcher:" + viewPager.getId() + ":" + fragmentPosition);
// if fragment is null, it was not created yet by ViewPager
NOTE:
It is worth noting that you should NOT rely on getItem(int position) {
to return the same fragment instance as you passed in, because that will lead you to this problem. (This question does it correctly, the getItem()
method must always return a new Fragment instance.)