Android FragmentStatePagerAdapter在重新加载中间Fragment时返回空白屏幕

7
我正在尝试使用FragmentStatePagerAdapter和ViewPager制作一个包含四个选项卡的应用程序。
当我第一次运行应用程序并按顺序选择选项卡(从0到3),一切都正常。但是,如果我尝试返回(从3到0),选项卡1会显示空白屏幕。之后,如果我选择选项卡2,则它也会变成空白。如果我回到选项卡0并再次进行操作,选项卡2就会恢复正常,有时选项卡1也会恢复正常,但我没有找到任何规律...
我知道这很混乱...问题是选项卡1经常失败,选项卡2有时会失败,而选项卡0和3始终正常工作。如果我交换片段的位置,一切都一样,因此我认为这与片段代码无关...
在logcat中没有显示错误,调试片段表明一切都按照应该的方式进行...
我已经花了几天时间来修复它,但没有成功。我尝试重写getItemPosition()以返回POSITION_NONE,我尝试像这里说的那样制作自己的FragmentStatePagerAdapterhttp://speakman.net.nz/blog/2014/02/20/a-bug-in-and-a-fix-for-the-way-fragmentstatepageradapter-handles-fragment-restoration/,但是没有用...还有其他一些对我没有起作用的方法。
一些代码: 主类
 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) {

    }

Adapter

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;
    }

....

}

谢谢。

更新:我的片段在不同的类中,并且它们不是静态的,这很重要吗?我刚刚意识到的另一件事是,它似乎在我触摸选项卡后破坏了该片段,因为如果我慢慢地滑动,我可以看到该片段,但突然间一切都消失了。


请更新,解决这个问题。 - Harish
2个回答

0

尝试使用 FragmentPagerAdapter

MyPageAdapter .java

public class MyPageAdapter extends FragmentPagerAdapter {

    public MyPageAdapter (FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int index) {

         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 null;
    }

    @Override
    public int getCount() {
        // get item count - equal to number of tabs
        return 4;
    }

}

0
我建议你使用 FragmentPagerAdapter 而不是 FragmentStatePagerAdapter。看起来你只想要 3 个 Tabs,每个 Tab 对应一个 Fragment,这不会太消耗内存(只要它们不充满 Bitmaps 等)。当使用 FragmentStatePagerAdapter 时,你需要负责恢复每个 Fragment 的状态,而使用 FragmentPagerAdapter 时,系统会持久化 View 层次结构,这正是你想要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接