我有一個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