首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FragmentStatePagerAdapter重复片段

FragmentStatePagerAdapter重复片段
EN

Stack Overflow用户
提问于 2014-07-30 02:03:03
回答 3查看 1K关注 0票数 3

我在我的单活动应用程序上使用嵌套FragmentStatePagerAdapter。当前布局为:

代码语言:javascript
复制
Activitiy
  - Login Fragment
  - Master Fragment
      - Tab Fragment #1
      - Tab Fragment #2
      - Tab Fragment #3
  - Another Fragment
  - Another Fragment

每次我从"Another Fragment“切换回"Master Fragment”时,FragmentStatePagerAdapter会实例化同一个项两次,例如

第一次:标签片段#1 #2 #3

第二次:标签片段#1 #1 #2 #2 #3 #3

第三次:标签片段#1 #1 #1 #2 #2 #2 #3 #3 #3。

为了在片段之间移动,我使用了

代码语言:javascript
复制
getSupportFragmentManager()
    .beginTransaction()
    .replace(android.R.id.content, XXXX.newInstance(query), TAG_XXX)
    .addToBackStack(null)
    .commit();

MasterFragment代码:

代码语言:javascript
复制
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    initFragmentAdapter();
}

private void initFragmentAdapter() {
    final FragmentSimpleAdapter adapter = new FragmentSimpleAdapter(getChildFragmentManager());

    adapter.addFragment(
            getString(...),
            "...",
            XXX.class);
    ...

    ViewPager viewPager = (ViewPager) getActivity().findViewById(android.R.id.tabcontent);
    viewPager.setAdapter(adapter);
    viewPager.setOffscreenPageLimit(4);

    PagerSlidingTabStrip viewTabs = (PagerSlidingTabStrip) getActivity().findViewById(
            android.R.id.tabhost);
    viewTabs.setViewPager(viewPager);
    viewTabs.setOnPageChangeListener(adapter);
}
    private final class FragmentSimpleAdapter extends FragmentStatePagerAdapter
       implements ViewPager.OnPageChangeListener {
    private final List<String> mTitles = new LinkedList<>();
    private final List<String> mInstances = new LinkedList<>();
    private final List<String> mTag = new LinkedList<>();
    private Map<Integer, String> mFragmentTags;
    private FragmentManager mFragmentManager;

    public FragmentSimpleAdapter(FragmentManager fm) {
        super(fm);
        mFragmentManager = fm;
        mFragmentTags = new HashMap<>();
    }

    @Override
    public int getCount() {
        return mTitles.size();
    }

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

    @Override
    public Fragment getItem(int position) {
        return Fragment.instantiate(getActivity(), mInstances.get(position), null);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Object obj = super.instantiateItem(container, position);
        if (obj instanceof Fragment) {
            Fragment f = (Fragment) obj;
            String tag = f.getTag();
            mFragmentTags.put(position, tag);
        }
        return obj;
    }

    public Fragment getFragment(int position) {
        String tag = mFragmentTags.get(position);
        if (tag == null) {
            return null;
        }
        return mFragmentManager.findFragmentByTag(tag);
    }

    public FragmentSimpleAdapter addFragment(String title, String tag,
                                             Class<? extends Fragment> fragment) {
        mTitles.add(title);
        mTag.add(tag);
        mInstances.add(fragment.getName());
        return this;
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }

    @Override
    public void onPageSelected(int position) {
            Analytics.sendViewAnalytic(mTag.get(position))
    }

    @Override
    public void onPageScrollStateChanged(int state) {
    }
}
EN

回答 3

Stack Overflow用户

发布于 2014-07-30 03:02:00

问题:

代码语言:javascript
复制
PagerSlidingTabStrip viewTabs = (PagerSlidingTabStrip) getActivity().findViewById(
        android.R.id.tabhost);

每次回到Master's Fragment内部时,您都会尝试重新创建和重新创建PagerSlidingTabStrip,从而添加不必要的片段。

解决方案:

你需要先检查标签是否已经存在,我不太了解那个PagerSlidingTabStrip,我想它是一个定制的类。

票数 0
EN

Stack Overflow用户

发布于 2018-08-02 14:36:02

在片段中嵌套片段时,应该使用getChildFragmentManager而不是getFragmentManager实例化FragmentStatePagerAdapter。

票数 0
EN

Stack Overflow用户

发布于 2014-07-30 12:04:12

已通过将FragmentSimpleAdapter初始化代码从onActivityCreate移动到onCreate修复

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25022028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档