“传递结果失败” – onActivityForResult

我有一个LoginActivity (用户login)。 它基本上是自己的Activity ,像对话框一样(看起来像一个对话框)。 它出现在SherlockFragmentActivity 。 我想要的是:如果login成功,应该有两个FragmentTransaction来更新视图。 这是代码:

LoginActivity ,如果login成功,

 setResult(1, new Intent()); 

SherlockFragmentActvity

 @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) 

首先,你应该阅读我的博客文章 ,了解更多信息(它会谈到为什么发生这种exception,以及你可以做些什么来阻止它)。

调用commitAllowingStateLoss()比修复更commitAllowingStateLoss() 。 国家损失是不好的,应该不惜一切代价避免。 在调用onActivityResult()的时候,活动/片段的状态可能还没有被恢复,因此在这段时间发生的任何事务都将因此而丢失。 这是必须解决的一个非常重要的错误! (请注意,只有当你的Activity被系统杀死后才会发生这个错误,这取决于设备有多less内存,有时可能是罕见的……所以这种错误并不是什么testing时很容易抓到)。

尝试将事务移动到onPostResume() (请注意,在onResume()onResume()始终在onActivityResult()之后调用onPostResume()后总是会调用):

 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 '状态已经恢复)。

这与@Alex Lockwood的答案类似,但使用Runnable

 private Runnable mOnActivityResultTask; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); mOnActivityResultTask = new Runnable() { @Override public void run() { // Your code here } } } @Override protected void onPostResume() { super.onPostResume(); if (mOnActivityResultTask != null) { mOnActivityResultTask.run(); mOnActivityResultTask = null; } } 

如果你使用lambdas运行Android 3.0及更高版本,请使用以下命令:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); mOnActivityResultTask = () -> { // Your code here } } 

在我的情况下,我面临同样的问题,因为以下

 public void onBackPressed() { super.onBackPressed(); setIntents(); } private void setIntents(){ Intent searchConstaints=new Intent(); searchConstaints.putExtra("min",20); searchConstaints.putExtra("max",80); setResult(101,searchConstaints); finish(); } 

通过重新安排onBackPressed()内的函数来解决

 public void onBackPressed() { setIntents(); super.onBackPressed(); } 

你可以使用ft.commitAllowingStateLoss()来解决这个问题。

原因:您的ft.commit()方法在onSaveInstanceState之后切换。

你的logcat清楚地说: “在onSaveInstanceState之后不能执行这个动作” – 你的Activity已经死了,并且不能返回任何结果。

移动:

 Intent in = new Intent(); setResult(1, in); 

Activity中它仍然活着的地方,一切都会好的。 并且不要忘记finish()你的Activity来交付结果。