Search code examples
javaandroidandroid-viewpager

Android Studio ViewPager with navigation


I have this situation:

Fragment1 uses viewPager, then when click some component inside the viewPager's child fragment, it open Fragment2, which also uses viewPager.

So far so good. But then, on click the back button, doesn't come back to Fragment1, coming back for my main activity instead. The app uses single activity and Android Navigation.

I already tried use viewPager2, it happens the same thing.

Thanks if anyone can help me.

public class Fragment1 extends AbstractNavFragment {

    private Fragment1 binder;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        binder = Fragment1Binding.inflate(inflater, container, false);
        return binder.getRoot();
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        binder.viewPager.setAdapter(new PageAdapterInternal(getChildFragmentManager()));
        binder.viewPager.setOffscreenPageLimit(2);
        binder.tabLayout.getTab().setupWithViewPager(binder.viewPager);
    }

    public void navigateToFragment2() {
        navigate(R.id.action_Fragment1_to_Fragment2);
    }

    private class PageAdapterInternal extends FragmentStatePagerAdapter {

        public PageAdapterInternal(@NonNull FragmentManager fm) {
            super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        }

        @NonNull
        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return new IrcSupplyPositionsFragment(IrcSupplyPositionsFragment.FragmentType.PENDING);
                case 1:
                    return new IrcSupplyPositionsFragment(IrcSupplyPositionsFragment.FragmentType.COMPLETED);
                default:
                    throw new IllegalStateException("Unexpected value: " + position);
            }
        }

        @Nullable
        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return translate("rotativeInventory.supply.pendingPositions");
                case 1:
                    return translate("rotativeInventory.supply.positionsCompleted");
                default:
                    return "";
            }
        }

        @Override
        public int getCount() {
            return 2;
        }
    }
}
public class Fragment2 extends AbstractNavFragment {

    private Fragment2 binder;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        binder = Fragment2Binding.inflate(inflater, container, false);
        return binder.getRoot();
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        binder.viewPager.setAdapter(new RotativeInventorySupplyUDFragment.PageAdapterInternal(getChildFragmentManager()));
        binder.viewPager.setOffscreenPageLimit(2);
        binder.tabLayout.getTab().setupWithViewPager(binder.viewPager);
    }

    @Override
    protected void doOnViewCreate() {}

    private class PageAdapterInternal extends FragmentStatePagerAdapter {

        public PageAdapterInternal(@NonNull FragmentManager fm) {
            super(fm);
        }

        @NonNull
        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return new IrcSupplyUDFragment(IrcSupplyUDFragment.FragmentType.PENDING);
                case 1:
                    return new IrcSupplyUDFragment(IrcSupplyUDFragment.FragmentType.COMPLETED);
                default:
                    throw new IllegalStateException("Unexpected value: " + position);
            }
        }

        @Nullable
        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return translate("rotativeInventory.supply.pendingPositions");
                case 1:
                    return translate("rotativeInventory.supply.positionsCompleted");
                default:
                    return "";
            }
        }

        @Override
        public int getCount() {
            return 2;
        }
    }
}

Solution

  • You have to override your onBackPressed method of your Activity, to controll all this stuff or register your fragment for a OnBackPressedDispatcher and when user click on back button of your device, take a decision, like ==> findNavController().popBackStack()