可滑动和可更换的标签,片段和ActionBar

时间:2012-05-05 22:08:08

标签: android fragment

正如主题所述,我正在尝试使用Fragments和ActionBar实现可跳过的选项卡。我已经使用ActionBarSherlock和使用TabsAdapter类(子类到FragmentPageAdapter)的示例中的代码成功补充了它。一些片段应该能够在同一个选项卡spor中显示一个新选项卡,这就是问题出现的地方。我真的无法弄清楚如何用新的片段替换寻呼机中的片段。我用Google搜索并尝试了很多东西。

我可以替换FragmentPageAdapter中包含片段类的内部集合中的片段,从而使得新片段可用于getItem方法,但是不能这样做,因为我无法弄清楚如何将寻呼机更新为展示新片段。即使在切换到另一个Tab并返回之后,我仍然会得到旧的Fragment,我认为它正在被寻呼机缓存到某处。那么有没有办法通知寻呼机的更新?

也许我应该忘记使用FragmentPageAdapter?在那种情况下,获得所有这些功能的正确方法是什么?

P.S。如果你想看到我的代码让我知道,但它与示例中的基本相同,而且我认为问题更为普遍

2 个答案:

答案 0 :(得分:0)

当您使用ViewPager时,除了您可以导航到的页面/片段之外,它还会将可见页面/片段保留在内存中。除此之外,如果ViewPager使用FragmentPagerApdapter,它会将视图保留在内存中以供活动生命使用。

我在上面回复了一篇类似的帖子,删除了一个可以在这里找到的片段。您的案例是此案例的延伸,删除然后添加其他内容。

https://stackoverflow.com/a/10399127/629555

基本上,您需要使用FragmentStatePagerAdapter,覆盖getItemPosition方法才能返回PagerAdapter.POSITION_NONE,并确保在需要更改时调用适配器上的.notifyDataSetChanged();

上面链接的答案更详细地介绍了这一点,并提供了一个代码示例。

答案 1 :(得分:0)

使用FragmentStatePagerAdapter保持对我自己的适配器中的片段的引用怎么样?然后我把它们都保存在内存中,但也完全控制删除。这种方法有什么不好我会遗漏,以后会遇到问题吗?此外,我已经更改,因此片段作为对象而不是类传递,从而将启动留在寻呼机之外。这有什么问题吗?

附加我的适配器代码:

public static class TabsAdapter extends FragmentStatePagerAdapter  implements
ActionBar.TabListener, ViewPager.OnPageChangeListener {
    private final Context mContext;
    private final ActionBar mActionBar;
    private final ViewPager mViewPager;
    private final ArrayList<Fragment> mTabs = new ArrayList<Fragment>();


    public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
        super(activity.getSupportFragmentManager());
        mContext = activity;
        mActionBar = activity.getSupportActionBar();
        mViewPager = pager;
        mViewPager.setAdapter(this);
        mViewPager.setOnPageChangeListener(this);
    }

    public void addTab(ActionBar.Tab tab, Fragment fragment) {          
        tab.setTag(fragment);
        tab.setTabListener(this);
        mTabs.add(fragment);
        mActionBar.addTab(tab);


        notifyDataSetChanged();
    }           

    public void replaceTab(ActionBar.Tab tab, Fragment fragment, int position) {

        tab.setTag(fragment);
        tab.setTabListener(this);
        mTabs.set(position, fragment);
        notifyDataSetChanged(); 
    } 

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

    @Override
    public Fragment getItem(int position) {
        return mTabs.get(position);
    }

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

    @Override
    public void onPageSelected(int position) {
        mActionBar.setSelectedNavigationItem(position);
    }

    @Override
    public void onPageScrollStateChanged(int state) {
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        Object tag = tab.getTag();
        for (int i = 0; i < mTabs.size(); i++) {
            if (mTabs.get(i) == tag) {
                mViewPager.setCurrentItem(i);
            }
        }
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }

    @Override
    public int getItemPosition(Object object){
        return PagerAdapter.POSITION_NONE;
    }
}