我有一个LoginActivity
(用户登录)。它基本上是它自己的Activity
,它的主题就像对话框一样(显示为对话框)。它出现在SherlockFragmentActivity
之上。我想要的是:如果登录成功,则应该有两个FragmentTransaction
来更新视图。下面是代码:“Failure Delivering Result” - onActivityForResult
在LoginActivity
,如果登录成功,
setResult(1, new Intent());
在SherlockFragmentActivity
:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 1) {
LoggedStatus = PrefActivity.getUserLoggedInStatus(this);
FragmentTransaction t = MainFragmentActivity.this.getSupportFragmentManager().beginTransaction();
SherlockListFragment mFrag = new MasterFragment();
t.replace(R.id.menu_frame, mFrag);
t.commit();
// Set up Main Screen
FragmentTransaction t2 = MainFragmentActivity.this.getSupportFragmentManager().beginTransaction();
SherlockListFragment mainFrag = new FeaturedFragment();
t2.replace(R.id.main_frag, mainFrag);
t2.commit();
}
}
它崩溃的第一次提交,这个logcat的:
E/AndroidRuntime(32072): Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
E/AndroidRuntime(32072): at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299)
E/AndroidRuntime(32072): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310)
E/AndroidRuntime(32072): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
E/AndroidRuntime(32072): at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525)
E/AndroidRuntime(32072): at com.kickinglettuce.rate_this.MainFragmentActivity.onActivityResult(MainFragmentActivity.java:243)
E/AndroidRuntime(32072): at android.app.Activity.dispatchActivityResult(Activity.java:5293)
E/AndroidRuntime(32072): at android.app.ActivityThread.deliverResults(ActivityThread.java:3315)
在片段中,我使用onResume时不存在onPostResume。我还没有看到这个问题,但也许你想对此发表评论。 PS:非常感谢您富有洞察力的帖子! – Maragues 2013-09-18 14:17:49
是的,在'Fragment#onResume()'中这样做很好。这是因为'FragmentActivity#onPostResume()'调用'FragmentActivity#onResumeFragments()',它调用'FragmentManager#dispatchResume()',为每个活动的片段调用'Fragment#onResume()'。因此'Fragment#onResume()'在'FragmentActivity#onPostResume()'之后被调用,所以不会有问题(你可以查看[源代码](http://goo.gl/Lo1Z1T )每个班级为自己验证这个...或者你可以只是我:P)。谢谢!很高兴你认为他们很有洞察力。 :) – 2013-09-18 21:13:58
@Alex,如果dialogfragment进行网络调用,并且在dialogfragment获取异步响应之前按下Home按钮,则在异步响应中调用this.dismiss()将导致状态丢失异常。在这种情况下,何时应该调用dismiss()以使状态不会丢失?请注意,请求和响应在dialogfragment中,而不在活动中。 – 2013-10-29 07:08:58