Restoring fragment state when changing fragments through bottom navigation bar

后端 未结 4 704
星月不相逢
星月不相逢 2020-12-24 09:22

I have bottom navigation bar on click of item in navigation bar i am replacing fragments. I have 3 fragments A,B,C so on click of b item B fragment is loaded and in B i am c

4条回答
  •  天涯浪人
    2020-12-24 09:38

    You should use a FragmentPagerAdapter to initiate the fragments so when you want to switch in between them, the state of the fragments will be saved.

    CutomViewPager viewPager = (CustomViewPager) findViewById(R.id.viewpager1);
    ViewPagerAdapter adapter = new ViewPagerAdapter (MainActivity.this.getSupportFragmentManager());
    adapter.addFragment(new SpotFeedMapFragment(), "title");
    adapter.addFragment(new BusLocationsFragment(), "title");
    adapter.addFragment(new NewsFeedActivity(), "title");
    viewPager.setAdapter(adapter);
    

    then in the bottom navigation selected you can set fragment by simple command

    viewPager.setCurrentItem(n);
    

    my viewpager class is as follows:

    public class CustomViewPager extends ViewPager {
    
    private boolean isPagingEnabled;
    
    public CustomViewPager(Context context) {
        super(context);
        this.isPagingEnabled = true;
    }
    
    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.isPagingEnabled = true;
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return this.isPagingEnabled && super.onTouchEvent(event);
    }
    
    //for samsung phones to prevent tab switching keys to show on keyboard
    @Override
    public boolean executeKeyEvent(KeyEvent event) {
        return isPagingEnabled && super.executeKeyEvent(event);
    }
    
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return this.isPagingEnabled && super.onInterceptTouchEvent(event);
    }
    
    public void setPagingEnabled(boolean enabled) {
        this.isPagingEnabled = enabled;
    }
    }
    

    in the xml instead of a empty layout for fragemnt u need:

    
    

    Code for custom FragmentPagerAdapter:

    private class ViewPagerAdapter extends FragmentPagerAdapter {
        private final SparseArray> instantiatedFragments = new SparseArray<>();
        private final List mFragmentList = new ArrayList<>();
        private final List mFragmentTitleList = new ArrayList<>();
    
        ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }
    
        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }
    
        @Override
        public int getCount() {
            return mFragmentList.size();
        }
    
        void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }
    
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            final Fragment fragment = (Fragment) super.instantiateItem(container, position);
            instantiatedFragments.put(position, new WeakReference<>(fragment));
            return fragment;
        }
    
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            instantiatedFragments.remove(position);
            super.destroyItem(container, position, object);
        }
    
        @Nullable
        Fragment getFragment(final int position) {
            final WeakReference wr = instantiatedFragments.get(position);
            if (wr != null) {
                return wr.get();
            } else {
                return null;
            }
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
    

提交回复
热议问题