我有一个带有几个SherlockFragmentActivities和SherlockFragment的应用程序。我在支持活动之间的轮换和转换方面遇到了麻烦。
在我的第一个SherlockFragmentActivity中,我尝试使用此代码捕获旋转:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
InitializeUI();
details = new MeetingConnectFragment();
getSupportFragmentManager().beginTransaction().add(
R.id.activity_scheduled_meeting_connect, details).commit();
}
}
//this is called when the screen rotates.
// (onCreate is no longer called when screen rotates due to manifest, see: android:configChanges)
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
InitializeUI();
details = new MeetingConnectFragment();
details.setInfo(cInfo);
FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.replace(R.id.activity_scheduled_meeting_details, details);
trans.addToBackStack(null);
trans.commit();
}
private void InitializeUI() {
setContentView(R.layout.activity_meeting_connect);
// other stuff cut for brevity
}
在MeetinConnectFragment中,有一个按钮可以显示不同的活动。如果用户在第二个活动中旋转屏幕,然后返回到此活动,程序将崩溃并出现异常:
E/AndroidRuntime(17976): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
E/AndroidRuntime(17976): at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299)
E/AndroidRuntime(17976): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310)
E/AndroidRuntime(17976): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
E/AndroidRuntime(17976): at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525)
E/AndroidRuntime(17976): at com.level3.connect.meetings.MeetingConnectActivity.onConfigurationChanged(MeetingConnectActivity.java:49)
E/AndroidRuntime(17976): at android.app.ActivityThread.performConfigurationChanged(ActivityThread.java:3675)
E/AndroidRuntime(17976): at android.app.ActivityThread.handleActivityConfigurationChanged(ActivityThread.java:3849)
E/AndroidRuntime(17976): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1370)
E/AndroidRuntime(17976): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(17976): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(17976): at android.app.ActivityThread.main(ActivityThread.java:4921)
E/AndroidRuntime(17976): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(17976): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(17976): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
E/AndroidRuntime(17976): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
E/AndroidRuntime(17976): at dalvik.system.NativeStart.main(Native Method)
提交更改的行是异常。我一直试图弄清楚如何处理这种情况,但我不是那里。帮助赞赏。
答案 0 :(得分:0)
尝试将来电移至InitializeUI()
以下的trans.commit()
。
当Activity设置新的内容视图时,它将调用onSaveInstanceState()
,因此您会收到您看到的IllegalStateException。
答案 1 :(得分:0)
我最终删除了配置/旋转的所有处理并让Android处理它为了做到这一点,我不得不删除代码以检查活动中onCreate中savedInstanceState是否为null。每次创建活动时,它都会重新创建片段。
我必须运行一些测试来查看是否会导致内存泄漏 - 也许我需要先破坏旧的片段。