android - "Failure Delivering Result "- onActivityForResult

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

我有一个 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/

相关文章:

android - 通知通知Android时空对象引用错误 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()'

java - 从 Activity 类中打开 Android 抽屉导航

java - 在特定代码后获取 Android 上的电池电量

Android 应用仅为一个 Activity 启用 NFC

Android 对单个 EditText 使用 colorControl

android - Admob 与 pygame 在 android 中的集成

android 闹钟管理器在几个小时后停止

android - android中autocompleteFilter的国家限制

android - TextView文本大小方法

android - 与 Android 4.0.3 中的 noHistory 属性不一致