正如主题所述,我正在尝试使用Fragments和ActionBar实现可跳过的选项卡。我已经使用ActionBarSherlock和使用TabsAdapter类(子类到FragmentPageAdapter)的示例中的代码成功补充了它。一些片段应该能够在同一个选项卡spor中显示一个新选项卡,这就是问题出现的地方。我真的无法弄清楚如何用新的片段替换寻呼机中的片段。我用Google搜索并尝试了很多东西。
我可以替换FragmentPageAdapter中包含片段类的内部集合中的片段,从而使得新片段可用于getItem方法,但是不能这样做,因为我无法弄清楚如何将寻呼机更新为展示新片段。即使在切换到另一个Tab并返回之后,我仍然会得到旧的Fragment,我认为它正在被寻呼机缓存到某处。那么有没有办法通知寻呼机的更新?
也许我应该忘记使用FragmentPageAdapter?在那种情况下,获得所有这些功能的正确方法是什么?
P.S。如果你想看到我的代码让我知道,但它与示例中的基本相同,而且我认为问题更为普遍
答案 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;
}
}