“传递结果失败” – 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
来交付结果。