我正在尝试使用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-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) { }
适配器
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; } .... }
谢谢.
更新:我的片段是分开的类,它们不是静态的,这很重要吗?我刚刚意识到的另一件事是,在我触摸标签后它似乎正在破坏片段,因为如果我慢慢地滑动我可以看到片段但突然一切都消失了
解决方法
我建议你使用FragmentPagerAdapter而不是FragmentStatePagerAdapter.看起来你只想要每个都有3个Tabs和一个片段,这听起来并不太占用内存(只要它们没有充满Bitmaps等).使用FragmentStatePagerAdapter时,您负责在重新加载时恢复每个Fragment的状态,使用FragmentPagerAdapter系统会保留View层次结构,这就是您想要的.