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