Android 将片段替换为ViewPager中的另一个片段
我正在使用ViewPager和FragmentPagerAdapter来承载三个不同的片段Android 将片段替换为ViewPager中的另一个片段,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我正在使用ViewPager和FragmentPagerAdapter来承载三个不同的片段 [Fragment1][Fragment2][Fragment3] 我试图实现的是,如果一个特定任务成功,用一个全新的片段Fragment4成功地替换Fragment1 当我使用 FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.
[Fragment1][Fragment2][Fragment3]
我试图实现的是,如果一个特定任务成功,用一个全新的片段Fragment4成功地替换Fragment1
当我使用
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fragment1_layout_id, fragment4);
transaction.commit();
..片段被漂亮地替换,显示的是片段4而不是片段1。尽管我一路刷到Fragment3,然后又刷回Fragment4,Fragment1就卷土重来了
再说一次,如果我用
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(fragment1);
transaction.commit();
…碎片1被移除,当我回来时碎片4就在那里。因此,此解决方案的问题是,当Fragment1被删除时,我无法找到立即显示Fragment4的方法,即使我尝试:
transaction.add(fragment4);
transaction.show(fragment4);
下面是我的FragmentPagerAdapter实现目前的样子,没有任何事务管理:
public static class PagerAdapter extends FragmentPagerAdapter {
public PagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return VIEW_COUNT;
}
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
switch (position) {
case 0:
fragment = Fragment1.newInstance(context_);
break;
case 1:
fragment = Fragment2.newInstance(context_);
break;
case 2:
fragment = Fragment3.newInstance(context_);
break;
default:
break;
}
return fragment;
}
}
编辑
看来我对我的问题不是很清楚。我决定把我之前制作的意大利面全部去掉,并试图说明我已经把它们去掉了(见上面粗体的文字)
总之,下面是我在getItem()中所做的大部分工作:
有了这段代码,我什么也做不了,但是如果有人看到我做错了什么,并且想给我指出正确的方向,我会非常感激 在某些情况下,您的
getItem
语句不应该为案例0
返回fragment4吗?尝试使用FragmentStatePagerAdapter
因为它会在您浏览视图时删除片段(也在您调用getitem时),所以您不需要自己显式删除它们
我也有同样的问题,这对我很有效
我尝试您的代码并删除
if(fragment!=null)
块,它就可以工作了。嘿,我已经解决了这个问题,使用FragmentPagerAdapter中的一个列表来处理各种片段,然后我的getItem就是这样
public void addScreen(String tag, Class<?> clss, Bundle args){
if(clss!=null){
TabInfo info = new TabInfo(tag, clss, args);
screens.add(info);
}
}
@Override
public Fragment getItem(int position) {
TabInfo info = screens.get(position);
return Fragment.instantiate(context, info.clss.getName(), info.args);
}
正如Maurycy所说,只要您想告诉ViewPager片段已被替换,就需要调用
mAdapter.notifyDataSetChanged()
。但是,您还需要重写适配器中的getItemPosition()
抽象函数,并在使用旧的、要隐藏的片段作为参数调用时返回POSITION\u NONE。否则,ViewPager将保留所有当前片段
有关更多信息和示例代码,请参见。尝试将offScreenPageLimit设置为5(或基于您的用例),以避免重新加载片段,这样您所替换的内容将保留下来,而不是在您刷卡时重新加载
mViewPager.setOffscreenPageLimit(5);
我认为你应该在PagerAdapter中更改getItem。返回的片段必须是可见的。@dziobas这正是我一直在尝试执行问题中描述的魔法的地方,但运气不好。请参阅我的文章,了解如何使用
ViewPager
和FragmentPagerAdapter
插入/替换选项卡的类似问题。单击选项卡1时,会调用fragment2,我不知道为什么叫tab2?是适配器错误吗?是的,应该是这样的,我整天都在努力找到正确的方法。我更新了我的问题,并添加了到目前为止我是如何尝试的。你能展示一些代码吗。我将非常感激,因为我遵循了你的步骤,但我没有得到我想要的。。。
mAdapter.notifyDataSetChanged()
mViewPager.setOffscreenPageLimit(5);