关于Fragment切换界面空白那些事
楼主在做一个类似主界面于网易新闻的demo
主界面下方为5个父Fragment,Fragment之间的切换用FragmentTransaction
第一,第二个父界面分别为fragment+viewpager选项卡那种界面
页面大概是这样
问题来了…….
我在开发到第二个父界面时(第二个父界面与第一个类似),程序第一个加载为第一个父界面,第一个界面显示正常,但是切换到第二个界面时,界面为空白,上方选项卡切换之后界面依然空白
我是这样处理父Fragment之间的切换的
private void initFragment(int index) {
// 由于是引用了V4包下的Fragment,所以这里的管理器要用getSupportFragmentManager获取
if (index == currentPage) {
return;
}
// 开启事务
FragmentTransaction transaction = mFragmentManager.beginTransaction();
// 隐藏所有Fragment
// hideFragment(transaction);
if (currentPage != -1) {
switch (currentPage) {
case 0:
if (mMainHomePageFragment != null) {
transaction.hide(mMainHomePageFragment);
}
break;
case 1:
if (mMainRankPageFragment != null) {
transaction.hide(mMainRankPageFragment);
}
break;
case 2:
if (mMainClassifyPageFragment != null) {
transaction.hide(mMainClassifyPageFragment);
}
case 3:
if (mMainHomePageFragment != null) {
transaction.hide(mMainHomePageFragment);
}
break;
}
}
switch (index) {
case BOTTOM_ITEM_TITLE_HOME_INDEX:
currentPage = 0;
if (mMainHomePageFragment == null) {
mMainHomePageFragment = new MainHomePageFragment();
transaction.add(R.id.fl_content, mMainHomePageFragment);
} else {
transaction.show(mMainHomePageFragment);
}
break;
case BOTTOM_ITEM_TITLE_RANK_INDEX:
currentPage = 1;
if (mMainRankPageFragment == null) {
mMainRankPageFragment = new MainRankPageFragment();
transaction.add(R.id.fl_content, mMainRankPageFragment);
} else {
transaction.show(mMainRankPageFragment);
}
break;
}
}
主Fragment的切换处理的这样:每个父Fragment显示时,如果是第一次,transaction是add添加,并且保存为成员变量,如果已经有该成员变量,则是调用ttransaction.show
父Fragment切换的时候是先隐藏之前显示的,再显示或添加新的Fragment
这样处理看上去没什么问题(楼主至今都不知道有什么不妥)
经过一番捣鼓之后,还是不知道问题出在哪,我就试着每次切换的时候,把之前的Fragment都remove掉,每次都是add操作,这样刚刚的那个问题就解决掉了
private void initFragment(int index) {
// 由于是引用了V4包下的Fragment,所以这里的管理器要用getSupportFragmentManager获取
if (index == currentPage) {
return;
}
// 开启事务
FragmentTransaction transaction = mFragmentManager.beginTransaction();
// 隐藏所有Fragment
// hideFragment(transaction);
if (currentPage != -1) {
switch (currentPage) {
case 0:
if (mMainHomePageFragment != null) {
transaction.remove(mMainHomePageFragment);
}
break;
case 1:
if (mMainRankPageFragment != null) {
transaction.remove(mMainRankPageFragment);
}
break;
case 2:
if (mMainClassifyPageFragment != null) {
transaction.remove(mMainClassifyPageFragment);
}
case 3:
if (mMainHomePageFragment != null) {
transaction.remove(mMainHomePageFragment);
}
break;
}
}
switch (index) {
case BOTTOM_ITEM_TITLE_HOME_INDEX:
currentPage = 0;
if (mMainHomePageFragment == null) {
mMainHomePageFragment = new MainHomePageFragment();
}
transaction.add(R.id.fl_content, mMainHomePageFragment);
break;
case BOTTOM_ITEM_TITLE_RANK_INDEX:
currentPage = 1;
if (mMainRankPageFragment == null) {
mMainRankPageFragment = new MainRankPageFragment();
}
transaction.add(R.id.fl_content, mMainRankPageFragment);
break;
但是这应该不是最好的解决办法,虽然父Fragment的实例没有被销毁,但是父Fragment切换的时候视图层都需要重新绘制(请各位大神看看有没有更好的解决上面那个问题的办法)
紧接着第二个问题出现了,第一个父Fragment之间的切换时,每个父Fragment的子Fragment都是可以显示的,但是父Fragment多切换
几次之后有些子Fragment变成空白页,这种问题就比较常见了,主要是有两个原因:
1.每次切换Fragment时都会调用Fragment的Fragment的oncreateView方法
将视图存为成员变量,调用父界面清除之前视图即可
(记得是不仅是每个父Fragment都要这样操作,每个父Fragment的每个子Fragment的oncreateView方法也要这么操作)
2.楼主的每个fragmen都有很多个tab,切换的时候有时会变为空白,viewpager的适配器需要继承FragmentStatePagerAdapter而非FragmentPagerAdapter(区别可以百度,这里就不说了)