[英]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.
我使用第一,第二,第三选项卡的片段来收集保存在我的SharedPreferences中的数据,并在第四选项卡中接收它。
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. ViewPager
不会一次创建所有页面。 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. FragmentStatePagerAdapter不保存任何Fragment实例,而是保存它们的savedInstanceState。
if a Fragment(page) is not visible, its instance will remain destroyed until it is visible again,then will be recreated from savedInstanceState. 如果一个Fragment(page)不可见,则其实例将保持销毁状态,直到再次可见为止,然后从saveInstanceState重新创建。
if you want to keep all Fragments alive,use FragmentPagerAdapter instead of FragmentStatePagerAdapter. 如果要使所有片段保持活动状态,请使用FragmentPagerAdapter而不是FragmentStatePagerAdapter。
see Offical doc 参见官方文档
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.