简体   繁体   中英

One of the fragments can’t immediately update data from other fragments

There's fragment that have four tabs on top. Every tab has own fragment. I use first, second, third tab's fragment to collect data save at my SharedPreferences And in fourth tab to receive it.

When switching fourth page,I would like to see the information I choose from others fragment. My problem is Only first tab can immediately pass data to fourth page, Whatever I save anything, it can display at fourth page right away that's what I want.

However, Others are weird

I need to one more step to switch to first's tab , it can even update my data from other tabs to fourth page.

What did I wrong with my code or order make this happen ?

public class UserActivityMenuFragment extends Fragment {
public static final String[] sTitle = new String[]{"first","second","third","fourth"};


@Nullable
@Override
public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.menu_activity,container ,false);
    initView(view);
    return view;
}


private void initView(View view) {
    ViewPager mViewPager = view.findViewById(R.id.containerView);
    TabLayout mTabLayout = view.findViewById(R.id.tabs);

    mTabLayout.addTab(mTabLayout.newTab().setText(sTitle[0]));
    mTabLayout.addTab(mTabLayout.newTab().setText(sTitle[1]));
    mTabLayout.addTab(mTabLayout.newTab().setText(sTitle[2]));
    mTabLayout.addTab(mTabLayout.newTab().setText(sTitle[3]));


    mTabLayout.setupWithViewPager(mViewPager);
    List<Fragment> fragments = new ArrayList<>();
    fragments.add(FirstFragment.newInstance());
    fragments.add(SecondFragment.newInstance());
    fragments.add(ThirdFragment.newInstance());
    fragments.add(FourthFragment.newInstance());


    UserActivityMenuAdapter adapter = new UserActivityMenuAdapter(getChildFragmentManager(),fragments, Arrays.asList(sTitle));
    mViewPager.setAdapter(adapter);
    mViewPager.setOffscreenPageLimit(2);


    mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {

        }
        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }
        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

    mViewPager.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) {

        }
    });

}

My adapter

public class UserActivityMenuAdapter extends FragmentStatePagerAdapter {
    private List<Fragment> mFragments ;
    private List<String> mTitles ;

    public UserActivityMenuAdapter
            (FragmentManager fm, List<Fragment> fragments, List<String> titles) {
        super(fm);
        mFragments = fragments;
        mTitles = titles;
    }

    @Override
    public Fragment getItem(int position) {
        return mFragments.get(position);
    }

    @Override
    public int getCount() {
        return mFragments == null ?0:mFragments.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mTitles.get(position);
    }
}

The ViewPager doesn't create all its pages at once. You can use below snippet to force it maintain all your fragments at the same time:

mViewPager.setOffscreenPageLimit(4);

FragmentStatePagerAdapter do not save any Fragment instances but their savedInstanceState.

if a Fragment(page) is not visible, its instance will remain destroyed until it is visible again,then will be recreated from savedInstanceState.

if you want to keep all Fragments alive,use FragmentPagerAdapter instead of FragmentStatePagerAdapter.

see Offical doc

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM