Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将片段替换为ViewPager中的另一个片段_Android_Android Fragments_Android Viewpager - Fatal编程技术网

Android 将片段替换为ViewPager中的另一个片段

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.

我正在使用ViewPager和FragmentPagerAdapter来承载三个不同的片段

[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);