Android 嵌套片段的困境:Eithter“;onSaveInstanceState”之后无法执行此操作;或;Can';t保留嵌套片段“;

Android 嵌套片段的困境:Eithter“;onSaveInstanceState”之后无法执行此操作;或;Can';t保留嵌套片段“;,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我有一个FragmentActivity,它保存一个片段(ContainerFragment),其中有一个FragmentStatePagerAdapter,它还嵌套了两个片段(一个映射和一个列表)。为了在方向更改后不获取空指针,我必须设置ContainerFragment setRetainInstance(true),嵌套片段不能设置为setRetainInstance(true),因为会出现异常“不能保留嵌套片段”。方向改变后一切正常,但当我从ListFragement开始一个新的细节片段

我有一个FragmentActivity,它保存一个片段(ContainerFragment),其中有一个FragmentStatePagerAdapter,它还嵌套了两个片段(一个映射和一个列表)。为了在方向更改后不获取空指针,我必须设置ContainerFragment setRetainInstance(true),嵌套片段不能设置为setRetainInstance(true),因为会出现异常“不能保留嵌套片段”。方向改变后一切正常,但当我从ListFragement开始一个新的细节片段时,我得到“onSaveInstanceState之后无法执行此操作”

我搜索了这两个例外的答案,但对我来说没有任何效果

在主要活动中:

    containerFragment = new ContainerFragment();

    FragmentTransaction transaction = getSupportFragmentManager()
            .beginTransaction();


    if (findViewById(R.id.fragment_container) != null) {
        transaction
                .replace(R.id.fragment_container, containerFragment );
    }

    transaction.addToBackStack(null);

    transaction.commit();
在集装箱破片中:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Retain this fragment across configuration changes.
    // If not set, there is a NPE on orientation change
    setRetainInstance(true);

    // load slide menu items
    mTabStrings = getResources().getStringArray(R.array.tabs_array);}

 public class MyPagerAdapter extends FragmentStatePagerAdapter {

    public MyPagerAdapter (FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {

        switch (i) {
        case 0:

            MapFragment mapFragment = (MapFragment ) Fragment
                    .instantiate(getActivity(),
                            MapFragment .class.getName());
            return mapFragment ;

        case 1:
            ListFragment listFragment = (ListFragment ) Fragment
                    .instantiate(getActivity(),
                            ListFragment .class.getName());

            return listFragment ;
        default:
            ListFragment listFragment = (ListFragment ) Fragment
                    .instantiate(getActivity(),
                            ListFragment .class.getName());

            return listFragment ;

        }
主活动中的此方法是从ListFragment触发的,在方向更改之前工作,但在更改之后不工作,在transaction.commit()之后带有“onSaveInstanceState之后无法执行此操作”


我找到了一个解决方案,在方向改变后没有得到npe。我在SharedReferences的onPause()处保存了活动的实例状态,因此不需要使用savedInstanceState。之后,我将所有片段设置为setRetainInstance(false),以消除IllegalStateException。但是我必须自己恢复每个嵌套片段,这似乎有点不方便。
@Override
public void onItemSelected(int position) {

    // Create fragment and give it an argument for the selected article
    XYFragment xyFragment = new XYFragment ();

    FragmentTransaction transaction = getSupportFragmentManager()
            .beginTransaction();

    // Replace whatever is in the fragment_container view with this
    // fragment,
    // and add the transaction to the back stack so the user can
    // navigate back
    if (findViewById(R.id.fragment_container) != null) {
        transaction.replace(R.id.fragment_container, xyFragment);
    }

    transaction.addToBackStack(null);
    // Commit the transaction
    transaction.commit();
}