重新加载中间片段时,Android FragmentStatePagerAdapter返回空白屏幕

jos*_*ash 7 android android-fragments android-viewpager fragmentstatepageradapter

我正在尝试使用FragmentStatePagerAdapter和ViewPager创建一个包含4个选项卡的应用程序.

当我第一次运行应用程序,如果我按顺序选择选项卡(0到3)一切顺利,然后如果我尝试执行返回的方式(3到0)选项卡1显示一个空白屏幕,如果,在那之后,我选择选项卡2,然后也是空白,如果我转到选项卡0并再次执行选项卡2恢复生命,有时选项卡1返回生活但我没有找到任何序列...

我知道这是一团糟...事情是标签1使用失败,标签2失败一些,标签0和3总是工作正常.如果我交换片段的位置一切都是一样的,我认为有些与片段代码无关......

logcat中没有显示错误,调试碎片显示一切都按照应该的方式进行...

我有几天试图修复它没有运气(显而易见......),我试图覆盖getItemPosition()以返回POSITION_NONE,我试图让我自己的FragmentStatePagerAdapter像这里说http:// speakman .net.nz/blog/2014/02/20/a-bug-in-and-a-fix-for-way-fragmentstatepageradapter-handles-fragment-restoration / but nothing ...还有一些东西可以避开对我有用.

一些代码: 主类

 public class Main extends FragmentActivity implements ActionBar.TabListener {
        private MyPageAdapter mPagerAdapter;
        private ViewPager mPager;

    @Override
    protected void onCreate(Bundle si) {
        super.onCreate(si);
        setContentView(R.layout.activity_main);
        init();
    }

        private void init() {
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        if (mPagerAdapter == null) {

            mPagerAdapter = new PaginaAdapter(getSupportFragmentManager());

            mPager = (ViewPager) findViewById(R.id.pager);
            mPager.setAdapter(mPagerAdapter);
            mPager.requestTransparentRegion(mPager);


            mPager.setOnPageChangeListener(new viewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    actionBar.setSelectedNavigationItem(position);
                }
            });

            // Tab creation
            for (int i = 0; i < mPagerAdapter.getCount(); i++) {
                View tabView = getLayoutInflater().inflate(R.layout.tab, null);
                ((ImageView) tabView.findViewById(R.id.tabIcon))
                .setImageDrawable(getResources().getDrawable(mPagerAdapter.getIcon(i)));

                           actionBar.addTab(actionBar.newTab().setCustomView(tabView).setTabListener(this));
            }

        }

    }

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

    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        mPager.setCurrentItem(tab.getPosition());
    }

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

    }
Run Code Online (Sandbox Code Playgroud)

适配器

public class MyPageAdapter extends FragmentStatePagerAdapter {
     public MyPageAdapter(FragmentManager fm) {
          super(fm);
     }

     @Override
     public Fragment getItem(int position) {

        Fragment fragment = null;

        switch (position) {
        case 0:
            fragment = new InitFragment();
            break;
        case 1:
            fragment = new MusicFragment();
            break;
        case 2:
            fragment = new VideoFragment();
            break;
        case 3:
            fragment = new PicFragment();
            break;
        }

        return fragment;
     }

        @Override
    public int getCount() {
        return 4;
    }

....

}
Run Code Online (Sandbox Code Playgroud)

谢谢.

更新:我的片段是分开的类,它们不是静态的,这很重要吗?我刚刚意识到的另一件事是,在我触摸标签后它似乎正在破坏片段,因为如果我慢慢地滑动我可以看到片段但突然一切都消失了

Emm*_*uel 0

我建议您使用FragmentPagerAdapter而不是FragmentStatePagerAdapter. 看来你只想每个都有 3Tabs和 a Fragment,这听起来不太占用内存(只要它们没有充满Bitmaps等)。使用时FragmentStatePagerAdapter,您负责Fragment在重新加载时恢复每个状态,FragmentPagerAdapter系统会保留View层次结构,这就是您想要的。