Android Fragment setRetainInstance(true)无法在backstack上运行

时间:2016-02-02 13:16:12

标签: android android-fragments

嗨我想让片段保持活着,即使它不再显示了。因为我有一些AsyncTasks。

首先,我要添加一个起点Fragment

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();   
fragmentTransaction.add(R.id.fragmentMenu, menuFragment);
fragmentTransaction.commit();

稍后我将menuFragment替换为应保持活力的片段

 FragmentTransaction ft = getFragmentManager().beginTransaction();
 ft.replace(R.id.fragmentMenu, btFragment).addToBackStack(null).commit();

最后,我覆盖使用onBackPressed()

popBackStack()方法
@Override
    public void onBackPressed() {
        if(getFragmentManager().getBackStackEntryCount() != 0){
            getFragmentManager().popBackStackImmediate();

        }else{
            super.onBackPressed();
        }
    }

在我的btFragment里面,即使我弹出另一个片段,我也应该保持活着,我已经在setRetainInstance(true)方法中设置了onCreate()。 但是一旦我弹出靠背堆就会被摧毁。

我做错了吗? THX

2 个答案:

答案 0 :(得分:0)

setRetainInstance()的文档说明它仅适用于活动娱乐:

  

控制是否在Activity中保留片段实例   重新创建(例如从配置更改)

答案 1 :(得分:0)

我通过一些解决方法解决了这个问题。如果有人对它感兴趣,这是代码。

// little work-around to not let btFragment die.
        Fragment fragment = getFragmentManager().findFragmentById(R.id.fragmentMenu);
        if (fragment instanceof BTFragment) {
            getFragmentManager().beginTransaction().hide(fragment).add(R.id.fragmentMenu, menuFragment).commit();

        } else if (getFragmentManager().getBackStackEntryCount() != 0) {
            getFragmentManager().popBackStackImmediate();
        } else {
            super.onBackPressed();
        }

基本上我隐藏片段而不是删除它,通过检查当前片段的FrameLayout,我可以处理不同的片段。这样,我的btFragment就不会调用onDestroy()方法。