Один из фрагментов не может немедленно обновить данные из других фрагментов - PullRequest
0 голосов
/ 23 сентября 2018

Есть фрагмент с четырьмя вкладками сверху.Каждая вкладка имеет свой фрагмент.Я использую фрагмент первой, второй, третьей вкладок, чтобы собрать данные, сохраненные в моих SharedPreferences, и на четвертой вкладке, чтобы получить их.

При переключении на четвертую страницу я хотел бы видеть информацию, которую я выбираю из других фрагментов.Моя проблема в том, что только первая вкладка может сразу передавать данные на четвертую страницу, что бы я ни сохранял, она может сразу же отображаться на четвертой странице, вот что я хочу.

Однако другие странные

IМне нужно сделать еще один шаг, чтобы перейти на первую вкладку, она может даже обновить мои данные с других вкладок на четвертую страницу.

Что я не так сделал с моим кодом или заказом, чтобы это произошло?

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

        }
    });

}

Мой адаптер

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);
    }
}

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

FragmentStatePagerAdapter не сохраняет никакие экземпляры Fragment, но их сохраненныйInstanceState.

, если Fragment (страница) не виден, его экземпляр будет оставаться уничтоженным до тех пор, пока он снова не станет видимым, а затем будет воссоздан из saveInstanceState.

если вы хотите сохранить все фрагменты, используйте FragmentPagerAdapter вместо FragmentStatePagerAdapter.

см. Официальный документ

0 голосов
/ 23 сентября 2018

ViewPager не создает все свои страницы одновременно.Вы можете использовать приведенный ниже фрагмент, чтобы заставить его поддерживать все ваши фрагменты одновременно:

mViewPager.setOffscreenPageLimit(4);
...