“未能提供结果” - onActivityResult

时间:2013-04-28 17:39:56

标签: android android-intent android-activity android-fragmentactivity

我有一个LoginActivity(用户登录)。它基本上是它自己的Activity,其主题就像一个对话框(看起来好像是一个对话框)。它显示在SherlockFragmentActivity上方。我想要的是:如果登录成功,应该有两个FragmentTransaction来更新视图。这是代码:

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)

5 个答案:

答案 0 :(得分:279)

首先,您应该阅读我的blog post以获取更多信息(它会讨论为什么会发生此异常以及您可以采取哪些措施来阻止它)。

调用commitAllowingStateLoss()更像是一个黑客而非修复。国家损失很严重,应该不惜一切代价避免。在调用onActivityResult()时,活动/片段的状态可能尚未恢复,因此在此期间发生的任何事务都将丢失。这是一个非常重要的错误,必须解决! (请注意,只有当你的Activity被系统杀死后回来时才会发生这个错误...这取决于设备有多少内存,有时候很少见......所以这种bug在测试时不是很容易捕获的东西。

请尝试将您的交易转移到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的{​​{1}}总是在<{em> Activity的状态之后提交恢复到原始状态(onPostResume()的状态恢复后,保证会调用Activity

答案 1 :(得分:2)

这类似于@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
    }
}

答案 2 :(得分:-1)

你的logcat清楚地说:“在onSaveInstanceState之后无法执行此操作” - 你的Activity已经死了,并且无法返回任何结果。

移动:

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

到你Activity还活着的地方,一切都会好的。 并且不要忘记finish() Activity来传递结果。

答案 3 :(得分:-1)

您可以使用ft.commitAllowingStateLoss()来解决此问题。

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

答案 4 :(得分:-1)

在我的案例中,由于以下原因我遇到了同样的问题

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();

}