Android getParentFragment () returns null in ViewPager inside fragment

I have an Activity that contains a Fragment with a ViewPager . Then I call the Fragment method in the ViewPager. But if this fragment calls getParentFragment() , it returns null.

Why is getParentFragment() null?


The main snippet containing the ViewPager:

 public class MyFragment extends Fragment { private TabLayout mTabLayout; private ViewPager mViewPager; private ViewPagerAdapter mAdapter; @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); View view = getView(); // Setup the ViewPager mViewPager = (ViewPager) view.findViewById(R.id.container); ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager(), getActivity()); mViewPager.setAdapter(adapter); //setupViewPager(mViewPager); // Setup the TabLayout mTabLayout = (TabLayout) view.findViewById(R.id.tabs); mTabLayout.setupWithViewPager(mViewPager); } // This method is called from Activity. public void callNestedFragment() { if (isDetached()) { return; } // This fragment cannot be null, because it doesn't crash here. (this is just a sample). ((Fragment0) mViewPager.getItem(0)).testMethod(); } } 

Nested fragment (inside mViewPager ):

 public class Fragment0 extends Fragment { ... public void testMethod() { if (isDetached()) { return; } // Why is getParentFragment() null? This is the log: "Parent fragment: null" Log.i(TAG, "Parent fragment: " + getParentFragment()); return; } } 

ViewPagerAdapter :

 public class ViewPagerAdapter extends FragmentPagerAdapter { private Context mContext; public ViewPagerAdapter(FragmentManager manager, Context context) { super(manager); mContext = context; } @Override public Fragment getItem(int position) { switch (position) { case 0: return new Fragment0(); case 1: return new Fragment1(); case 2: return new Fragment2(); case 3: return new Fragment3(); case 4: return new Fragment4(); } return null; } @Override public int getCount() { return 5; } } 

If more code is required, let me know. Thank you for your help.

+5
source share
2 answers

I have found the answer. If isDetached() true, this does not mean that getParentFragment() not null.

So, instead of the previous testMethod() check, this is the new code:

 public void testMethod() { if (isDetached() && getParentFragment() != null) { return; } ... } 

Now I again call the same method in the onStart() method in Fragment0 , where getParentFragment() must not be null.

+1
source

I tried to restore your example and it works fine in my project. Have you tried calling the getParentFragment() method from the onCreate method of Fragment0 ? It works?

PS I think this answer should be more of a comment, but I do not have enough reputation to post a comment.

0
source

Source: https://habr.com/ru/post/1258674/


All Articles