Android 嵌套片段的困境:Eithter“;onSaveInstanceState”之后无法执行此操作;或;Can';t保留嵌套片段“;
我有一个FragmentActivity,它保存一个片段(ContainerFragment),其中有一个FragmentStatePagerAdapter,它还嵌套了两个片段(一个映射和一个列表)。为了在方向更改后不获取空指针,我必须设置ContainerFragment setRetainInstance(true),嵌套片段不能设置为setRetainInstance(true),因为会出现异常“不能保留嵌套片段”。方向改变后一切正常,但当我从ListFragement开始一个新的细节片段时,我得到“onSaveInstanceState之后无法执行此操作” 我搜索了这两个例外的答案,但对我来说没有任何效果 在主要活动中:Android 嵌套片段的困境:Eithter“;onSaveInstanceState”之后无法执行此操作;或;Can';t保留嵌套片段“;,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我有一个FragmentActivity,它保存一个片段(ContainerFragment),其中有一个FragmentStatePagerAdapter,它还嵌套了两个片段(一个映射和一个列表)。为了在方向更改后不获取空指针,我必须设置ContainerFragment setRetainInstance(true),嵌套片段不能设置为setRetainInstance(true),因为会出现异常“不能保留嵌套片段”。方向改变后一切正常,但当我从ListFragement开始一个新的细节片段
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();
}