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

vel*_*elu 23 android android-fragments android-viewpager

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

[Fragment1][Fragment2][Fragment3]
Run Code Online (Sandbox Code Playgroud)

我想要实现的是如果特定任务成功,用一个全新的片段Fragment4成功替换Fragment1.

我用的时候..

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fragment1_layout_id, fragment4);
transaction.commit();
Run Code Online (Sandbox Code Playgroud)

..片段被精美地替换,片段4被显示而不是片段1.虽然只要我一直滑到Fragment3然后再回到Fragment4,Fragment1就会卷土重来.

然后,如果我使用..

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(fragment1);
transaction.commit();
Run Code Online (Sandbox Code Playgroud)

..Fragment1被删除,当我回来时Fragment4就在那里.所以这个解决方案的问题是我找不到立即显示Fragment4的方法,因为Fragment1被删除了,即使我尝试过:

transaction.add(fragment4);
transaction.show(fragment4);
Run Code Online (Sandbox Code Playgroud)

这就是我的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑.

所以我的问题似乎并不完全清楚.我决定删除我之前设法制作的所有意大利面,并试图说明我已将它们关闭(参见上面的粗体文字).

无论如何,这里几乎是我在getItem()中尝试做的事情:

@Override
public Fragment getItem(int position) {

    Fragment fragment = null;

    switch (position) {
    case 0:

        if (!app.isUserLoggedIn) {
            if (loginFragment_ == null) {
                loginFragment_ = LoginFragment.newInstance(context_);
                transaction_ = fragmentManager_.beginTransaction();

                if (logoutFragment_ != null) {
                    transaction_.remove(logoutFragment_);
                    logoutFragment_ = null;
                }

                transaction_.add(loginFragment_, "login");
                transaction_.commit();
            }

            if (fragmentManager_.findFragmentByTag("login") == null)
                fragment = LoginFragment.newInstance(context_);
            else
                fragment = fragmentManager_.findFragmentByTag("login");

        } else {
            if (logoutFragment_ == null) {                      
                logoutFragment_ = LogoutFragment.newInstance(context_);
                transaction_ = fragmentManager_.beginTransaction();

                if (loginFragment_ != null) {
                    transaction_.remove(loginFragment_);
                    loginFragment_ = null;
                }

                transaction_.add(logoutFragment_, "logout");
                transaction_.commit();
            }

            if (fragmentManager_.findFragmentByTag("logout") == null)
                fragment = LogoutFragment.newInstance(context_);
            else
                fragment = fragmentManager_.findFragmentByTag("logout");
        }
        break;

    case 1:
        fragment = HomeFragment.newInstance(context_);
        break;

    case 2:
        fragment = RegisterFragment.newInstance(context_);
        break;

    default:
        break;
    }

    return fragment;
}
Run Code Online (Sandbox Code Playgroud)

有了这个代码,我什么都没做,但如果有人看到我做错了什么,并想指出我正确的方向,我会非常感激!

GAO*_*kai 10

尝试使用FragmentStatePagerAdapter

http://android-developers.blogspot.com/2011_08_01_archive.html

因为它会在您浏览视图时删除片段(当您调用getitem时也是如此),因此您无需自己明确删除它们.

我一直遇到同样的问题,对我有用.

我尝试你的代码并删除if (fragment!=null)块,它的工作原理.