繁体   English   中英

片段之一无法立即从其他片段更新数据

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

片段顶部有四个选项卡。 每个选项卡都有自己的片段。 我使用第一,第二,第三选项卡的片段来收集保存在我的SharedPreferences中的数据,并在第四选项卡中接收它。

切换第四页时,我想查看我从其他片段中选择的信息。 我的问题是,只有第一个标签可以立即将数据传递到第四页,无论我保存什么,它都可以立即显示在第四页上。

但是,其他人很奇怪

我还需要一步来切换到“首页”标签,它甚至可以将我的数据从其他标签更新到第四页。

我的代码或命令有什么错呢?

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

ViewPager不会一次创建所有页面。 您可以使用以下代码段强制其同时维护所有片段:

mViewPager.setOffscreenPageLimit(4);

FragmentStatePagerAdapter不保存任何Fragment实例,而是保存它们的savedInstanceState。

如果一个Fragment(page)不可见,则其实例将保持销毁状态,直到再次可见为止,然后从saveInstanceState重新创建。

如果要使所有片段保持活动状态,请使用FragmentPagerAdapter而不是FragmentStatePagerAdapter。

参见官方文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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