簡體   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