我的活动中有这样的内容:
@Override
public void onNavigationDrawerItemSelected(int position) {
Fragment fragment = null;
switch (position+1) {
case 1: {
fragment = new Fragment_Login();
FragmentManager frgManager = getFragmentManager();
frgManager.beginTransaction().replace(R.id.container, fragment)
.commit();
break;
}
case 2: {
SwipeRefreshListFragment swipeFragment = new Fragment_List_Of_Assessments();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, swipeFragment)
.commit();
break;
}
case 3: {
fragment = new Fragment_Report();
FragmentManager frgManager = getFragmentManager();
frgManager.beginTransaction().replace(R.id.container, fragment)
.commit();
break;
}
case 4: {
fragment = new Fragment_Settings();
FragmentManager frgManager = getFragmentManager();
frgManager.beginTransaction().replace(R.id.container, fragment)
.commit();
break;
}
default:
break;
}
}
程序会自动加载case1,但是当选择case2时,getSupportFragmentManager会在case1之上加载Fragment。我猜想同时使用 supportFragmentManager 和 FragmentManager 会出现一些问题。他们似乎有自己的堆栈。问题是我不能只使用其中之一,因为 SwipeToRefresh Android 示例使用 ListView ,它需要 support.v4.Fragment ,而 support.v4.Fragment 需要旧的 FragmentManager 。那么如何将两个 FragmentManager 集成在一起呢?
我在使用 PreferenceFragment 时完成了类似的事情(不受支持库版本支持)。为了实现这一目标,我在 Activity 中保留了一对布尔值 (isLastFragmentSupportType
and lastFragmentShowed
) 以及一个字符串 (lastFragmentTag
).
一开始你的 Activity 会将它们都设置为 false。当你添加一个新的片段时,你使用这两个布尔值来知道是否需要清理另一个FragmentManager
或不。我将使用您的代码作为示例:
@Override
public void onNavigationDrawerItemSelected(int position) {
Fragment fragment = null;
switch (position+1) {
case 1: {
if(isLastFragmentSupportType && lastFragmentShowed)
{//As your last fragment was a support type you need to clear your supportFragmentManager
android.support.v4.app.Fragment fr_v4 = getSupportFragmentManager().findFragmentByTag(lastFragmentTag);
getSupportFragmentManager().beginTransaction().remove(fr_v4).commit();
}
fragment = new Fragment_Login();
FragmentManager frgManager = getFragmentManager();
frgManager.beginTransaction().replace(R.id.container, fragment,TAG1)
.commit();
lastFragmentTag = TAG1;
lastFragmentShowed = true;
isLastFragmentSupportType = false;
break;
}
//And so on with the others
您需要检查要使用的片段类型(支持或不支持),并检查这些变量以查看最后一个片段是否属于不同类型。如果是这种情况,请清理其他片段管理器以“清除”屏幕,这样它们就不会重叠。
还可以使用标签来识别和检索当前的片段,这样您就不需要Fragment
代码中的变量。
最后使用onSavedInstanceState
以便保留这些值以备不时之需。
希望能帮助到你 :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)