Search code examples
javaandroidandroid-fragmentsandroid-viewpager

ViewPager not visible on return after navigating from another Fragment


I have got classic Bottom Navigation created by default with 3 TABs (FragmentOne, FragmentTwo and FragmentThree). The first fragment (FragmentOne) has ViewPager with two static inner Fragments (FragmentInner1 and FragmentInner2).

When app starts evrything is fine so at the FragmentOne we can see FragmentInner1 and can navigate to FragmentInner2.

But after navigating from FragmentTwo to FragmentOne the FragmentInner1 is not visible. That is a problem.

I guess we should recreate it somehow? I investigated manual from here https://developer.android.com/guide/components/fragments.html and https://developer.android.com/training/implementing-navigation/lateral.html#PagerTitleStrip but it does not help and my code looks the same way.

Please help. Thank you!

FragmentOne

public class FragmentOne extends Fragment {

    //This is our viewPager
    private ViewPager viewPager;

    //Fragments
    FragmentInner1 fragmentInner1;
    FragmentInner2 fragmentInner2;

    ViewPagerAdapter adapter;

    private View view;

    public FragmentOne() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {

         view = inflater.inflate(R.layout.fragment_fragment_one, container, false);

        //Initializing viewPager
        viewPager = (ViewPager) view.findViewById(R.id.viewpager);

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        setupViewPager(viewPager);

        return view;
    }

    private void setupViewPager(ViewPager viewPager) {
        adapter  = new ViewPagerAdapter(getActivity().getSupportFragmentManager());
        fragmentInner1=new FragmentInner1();
        fragmentInner2=new FragmentInner2();
        adapter.addFragment(fragmentInner1);
        adapter.addFragment(fragmentInner2);
        viewPager.setAdapter(adapter);
    }

    @Override
    public void onAttach(Context context)
    {
        super.onAttach(context);
    }

    @Override
    public void onResume() {
        super.onResume();

    }

    @Override
    public void onPause() {
        super.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

ViewPagerAdapter

public class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }
    @Override
    public Fragment getItem(int position) {
        Fragment fragment = mFragmentList.get(position);
        return fragment;
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment) {
        mFragmentList.add(fragment);
    }
}

FragmentInner1

public class FragmentInner1 extends Fragment {

    public static FragmentInner1 newInstance( ) {
        FragmentInner1 fragment = new FragmentInner1();
        return fragment;
    }

    public FragmentInner1() {
    }    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {     
        return inflater.inflate(R.layout.fragment_fragment_inner1, container, false);
    }

}

enter image description here


Solution

  • You have to Use getChildFragmentManager() For Viewpager to adapt Popback Feature.

    adapter  = new ViewPagerAdapter(getChildFragmentManager());
    

    This is Because the Viewpager have multiple Fragments where Viewpager itself or is holded by another Fragment. So the Child Fragment is to Be Invoked and Used.

    You Can Refer this Documentation on ChildFragmentManager()