我有一个 LoginActivity
(用户登录)。它基本上是它自己的 Activity
主题,就像一个对话框(看起来好像一个对话框)。它出现在 SherlockFragmentActivity
上。我想要的是:如果登录成功,应该有两个 FragmentTransaction
来更新 View 。代码如下:
在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)
最佳答案
首先,你应该阅读我的blog post了解更多信息(它讨论了为什么会发生此异常以及您可以采取哪些措施来防止它发生)。
调用 commitAllowingStateLoss()
与其说是修复,不如说是 hack。状态损失是不好的,应该不惜一切代价避免。在调用 onActivityResult()
时, Activity/fragment 的状态可能尚未恢复,因此在此期间发生的任何事务都将因此丢失。这是一个非常重要的错误,必须解决! (请注意,仅当您的 Activity
在被系统杀死后返回时才会发生该错误......根据设备的内存量,有时可能很少见......所以这个那种错误在测试时不是很容易捕捉到的)。
尝试将您的事务转移到 onPostResume()
中(注意 onPostResume()
总是在 onResume()
和 之后调用onResume()
总是在 onActivityResult()
) 之后调用:
private boolean mReturningWithResult = false;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mReturningWithResult = true;
}
@Override
protected void onPostResume() {
super.onPostResume();
if (mReturningWithResult) {
// Commit your transactions here.
}
// Reset the boolean flag back to false for next time.
mReturningWithResult = false;
}
这可能看起来有点奇怪,但这样做是必要的,以确保您的 FragmentTransaction
始终在 Activity
之后提交>的状态已经恢复到原来的状态(onPostResume()
保证在Activity
的状态恢复后被调用)。
关于android - "Failure Delivering Result "- onActivityForResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16265733/