Activityのシステム破棄によるFragmentの混乱を解決
8241 ワード
Activityがメモリの緊張によってシステムによって破棄された場合に再構築されると、内部のfragmentは、特に1つのactivityに複数のfragmentを追加するインタフェースの表示を混乱させる可能性があります.解決策はsavedInstanceStateがNullであるかどうかを判断し、リカバリを行うことです.サンプルコードは以下の通りです.
private int saveIndex;// fragment
private boolean isHomeActDestroy;//activity
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if(savedInstanceState!=null&&savedInstanceState.getBoolean("isHomeActDestroy",false)){
saveIndex = savedInstanceState.getInt("SaveIndex", 0);
isHomeActDestroy=savedInstanceState.getBoolean("isHomeActDestroy",false);
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
Fragment f1 = manager.findFragmentByTag(MapFg.class.getSimpleName());
Fragment f2 = manager.findFragmentByTag(ShopFg.class.getSimpleName());
Fragment f3 = manager.findFragmentByTag(PublishFg.class.getSimpleName());
Fragment f4 = manager.findFragmentByTag(AroundFg.class.getSimpleName());
Fragment f5 = manager.findFragmentByTag(UserFg.class.getSimpleName());
switch (saveIndex){
case 0:
{
if (null==f1){
transaction.add(R.id.fragment_container,new MapFg(),MapFg.class.getSimpleName());
}else {
transaction.show(f1);
}
if (null!=f2)
transaction.hide(f2);
if (null!=f3)
transaction.hide(f3);
if (null!=f4)
transaction.hide(f4);
if (null!=f5)
transaction.hide(f5);
transaction.commitAllowingStateLoss();
}
break;
case 1:
{
if (null==f2){
transaction.add(R.id.fragment_container,new ShopFg(),ShopFg.class.getSimpleName());
}else {
transaction.show(f2);
}
if (null!=f1)
transaction.hide(f1);
if (null!=f3)
transaction.hide(f3);
if (null!=f4)
transaction.hide(f4);
if (null!=f5)
transaction.hide(f5);
transaction.commitAllowingStateLoss();
}
break;
// case 2:
// break;
case 3:
{
if (null==f4){
transaction.add(R.id.fragment_container,new AroundFg(),AroundFg.class.getSimpleName());
}else {
transaction.show(f4);
}
if (null!=f1)
transaction.hide(f1);
if (null!=f2)
transaction.hide(f2);
if (null!=f3)
transaction.hide(f3);
if (null!=f5)
transaction.hide(f5);
transaction.commitAllowingStateLoss();
}
break;
case 4:
{
if (null==f5){
transaction.add(R.id.fragment_container,new UserFg(),UserFg.class.getSimpleName());
}else {
transaction.show(f5);
}
if (null!=f1)
transaction.hide(f1);
if (null!=f2)
transaction.hide(f2);
if (null!=f3)
transaction.hide(f3);
if (null!=f4)
transaction.hide(f4);
transaction.commitAllowingStateLoss();
}
break;
default:
}
}
setContentView(R.layout.act_home);
if (savedInstanceState == null){
getSupportFragmentManager().beginTransaction().add(R.id.fragment_container,new MapFg(),MapFg.class.getSimpleName()).commit();
}
///
}
@Override
protected void onSaveInstanceState(Bundle outState)
{
outState.putInt("SaveIndex", saveIndex);
outState.putBoolean("isHomeActDestroy",true);
super.onSaveInstanceState(outState);
}