363

我有一个 Live Android 应用程序,从市场上我收到了以下堆栈跟踪,我不知道为什么它会发生,因为它没有发生在应用程序代码中,而是由应用程序中的某些或其他事件引起的(假设)

我没有使用 Fragments,仍然有 FragmentManager 的参考。如果有任何机构可以揭示一些隐藏的事实以避免此类问题:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1109)
at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:399)
at android.app.Activity.onBackPressed(Activity.java:2066)
at android.app.Activity.onKeyDown(Activity.java:1962)
at android.view.KeyEvent.dispatch(KeyEvent.java:2482)
at android.app.Activity.dispatchKeyEvent(Activity.java:2274)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1668)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1720)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1258)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1668)
at android.view.ViewRoot.deliverKeyEventPostIme(ViewRoot.java:2851)
at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2824)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2011)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4025)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)  
4

32 回答 32

465

这是迄今为止我遇到的最愚蠢的错误。我有一个Fragment适用于API < 11API > 11的应用程序。Force Closing

我真的无法弄清楚它们Activity在调用的生命周期内发生了什么变化saveInstance,但我是这样解决这个问题的:

@Override
protected void onSaveInstanceState(Bundle outState) {
    //No call for super(). Bug on API Level > 11.
}

我只是不打电话.super(),一切都很好。我希望这会为您节省一些时间。

编辑:经过更多研究,这是支持包中的一个已知错误

如果您需要保存实例,并向您添加一些内容,您outState Bundle可以使用以下内容:

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putString("WORKAROUND_FOR_BUG_19917_KEY", "WORKAROUND_FOR_BUG_19917_VALUE");
    super.onSaveInstanceState(outState);
}

EDIT2:如果您Activity在后台退出后尝试执行事务,也可能会发生这种情况。为避免这种情况,您应该使用commitAllowingStateLoss()

EDIT3:根据我的记忆,上述解决方案正在修复早期 support.v4 库中的问题。但是,如果您对此仍有疑问,您还必须阅读@AlexLockwood的博客:Fragment Transactions & Activity State Loss

博客文章的摘要(但我强烈建议您阅读它):

  • 切勿 在蜂窝前和蜂窝后进行commit()交易onPause()onStop()
  • Activity在生命周期方法中提交事务时要小心。使用 onCreate(),onResumeFragments()onPostResume()
  • 避免在异步回调方法中执行事务
  • commitAllowingStateLoss()仅作为最后手段使用
于 2012-04-21T17:41:52.690 回答
76

在 Android 源代码中查看导致此问题的原因会发现FragmentManagerImpl类中的标志 mStateSaved(Activity 中可用的实例)的值为 true。当从Activity#onSaveInstanceState. 之后来自 ActivityThread 的调用不会使用FragmentManagerImpl#noteStateNotSaved()和的可用重置方法重置此标志dispatch()

我看到它的方式有一些可用的修复程序,具体取决于您的应用程序正在做什么和使用:

好方法

最重要的是:我会宣传Alex Lockwood 的文章。然后,从我到目前为止所做的事情来看:

  1. 对于不需要保留任何状态信息的片段和活动,请调用commitAllowStateLoss。取自文档:

    允许在保存活动状态后执行提交。这是危险的,因为如果活动需要稍后从其状态恢复,提交可能会丢失,因此这应该只用于 UI 状态可以在用户上意外更改的情况。如果片段显示只读信息,我想这是可以使用的。或者即使他们确实显示了可编辑的信息,也可以使用回调方法来保留已编辑的信息。

  2. 在事务提交后(您刚刚调用commit()),调用FragmentManager.executePendingTransactions().

不推荐的方式:

  1. 正如上面提到的 Ovidiu Latcu 所说,不要调用super.onSaveInstanceState(). 但这意味着您将失去活动的整个状态以及片段状态。

  2. 覆盖onBackPressed并在那里只调用finish()。如果您的应用程序不使用 Fragments API,这应该没问题;因为super.onBackPressed有一个电话到FragmentManager#popBackStackImmediate().

  3. 如果您同时使用 Fragments API 并且您的活动状态很重要/至关重要,那么您可以尝试使用反射 API 进行调用FragmentManagerImpl#noteStateNotSaved()。但这是一种 hack,或者可以说这是一种解决方法。我不喜欢它,但就我而言,这是完全可以接受的,因为我有一个来自旧版应用程序的代码,它使用了已弃用的代码(TabActivity并且隐式地LocalActivityManager)。

下面是使用反射的代码:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    invokeFragmentManagerNoteStateNotSaved();
}

@SuppressWarnings({ "rawtypes", "unchecked" })
private void invokeFragmentManagerNoteStateNotSaved() {
    /**
     * For post-Honeycomb devices
     */
    if (Build.VERSION.SDK_INT < 11) {
        return;
    }
    try {
        Class cls = getClass();
        do {
            cls = cls.getSuperclass();
        } while (!"Activity".equals(cls.getSimpleName()));
        Field fragmentMgrField = cls.getDeclaredField("mFragments");
        fragmentMgrField.setAccessible(true);

        Object fragmentMgr = fragmentMgrField.get(this);
        cls = fragmentMgr.getClass();

        Method noteStateNotSavedMethod = cls.getDeclaredMethod("noteStateNotSaved", new Class[] {});
        noteStateNotSavedMethod.invoke(fragmentMgr, new Object[] {});
        Log.d("DLOutState", "Successful call for noteStateNotSaved!!!");
    } catch (Exception ex) {
        Log.e("DLOutState", "Exception on worka FM.noteStateNotSaved", ex);
    }
}

干杯!

于 2012-12-21T09:21:03.700 回答
38

如果您onSaveInstanceState()在调用片段活动后尝试执行片段转换,则会发生此类异常。

发生这种情况的一个原因是,如果您在活动停止时让AsyncTask(或Thread)运行。

如果系统为资源回收活动并在以后重新创建它,则调用之后的任何转换onSaveInstanceState()都可能会丢失。

于 2011-11-09T00:50:17.357 回答
27

只需在显示片段之前调用super.onPostResume()或在调用 super.onPostResume() 之后将代码移动到 onPostResume() 方法中。这样就解决问题了!

于 2013-09-16T09:20:26.690 回答
20

This can also happen when calling dismiss() on a dialog fragment after the screen has been locked\blanked and the Activity + dialog's instance state has been saved. To get around this call:

dismissAllowingStateLoss()

Literally every single time I'm dismissing a dialog i don't care about it's state anymore anyway, so this is ok to do - you're not actually losing any state.

于 2013-10-22T23:22:59.763 回答
17

简短而有效的解决方案:

遵循简单的步骤:

第 1 步:覆盖相应片段中的 onSaveInstanceState 状态。并从中删除超级方法。

@Override
public void onSaveInstanceState(Bundle outState) {
};

第 2 步:使用 CommitAllowingStateLoss(); 而不是提交();而片段操作。

fragmentTransaction.commitAllowingStateLoss();
于 2014-09-05T14:26:48.180 回答
13

我认为生命周期状态可以帮助防止从 Android 支持 lib v26.1.0 开始的此类崩溃,您可以进行以下检查:

if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)){
  // Do fragment's transaction commit
}

或者您可以尝试:

Fragment.isStateSaved()

更多信息在这里 https://developer.android.com/reference/android/support/v4/app/Fragment.html#isStateSaved()

于 2017-11-20T13:31:08.113 回答
7

这对我有用......我自己发现了这个......希望它对你有帮助!

1) 没有全局“静态”FragmentManager / FragmentTransaction。

2)onCreate,总是再次初始化FragmentManager!

下面的示例:-

public abstract class FragmentController extends AnotherActivity{
protected FragmentManager fragmentManager;
protected FragmentTransaction fragmentTransaction;
protected Bundle mSavedInstanceState;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mSavedInstanceState = savedInstanceState;
    setDefaultFragments();
}

protected void setDefaultFragments() {
    fragmentManager = getSupportFragmentManager();
    //check if on orientation change.. do not re-add fragments!
    if(mSavedInstanceState == null) {
        //instantiate the fragment manager

        fragmentTransaction = fragmentManager.beginTransaction();

        //the navigation fragments
        NavigationFragment navFrag = new NavigationFragment();
        ToolbarFragment toolFrag = new ToolbarFragment();

        fragmentTransaction.add(R.id.NavLayout, navFrag, "NavFrag");
        fragmentTransaction.add(R.id.ToolbarLayout, toolFrag, "ToolFrag");
        fragmentTransaction.commitAllowingStateLoss();

        //add own fragment to the nav (abstract method)
        setOwnFragment();
    }
}
于 2013-04-19T08:45:02.103 回答
6

当我尝试在 onActivityForResult() 方法中显示片段时,我总是得到这个,所以问题是下一个:

  1. 我的活动被暂停和停止,这意味着 onSaveInstanceState() 已经被调用(对于蜂窝前和蜂窝后设备)。
  2. 如果有任何结果,我会进行交易以显示/隐藏片段,这会导致此 IllegalStateException。

我做的是下一个:

  1. 用于确定我想要的操作是否已完成的附加值(例如,从camere 拍照-isPhotoTaken) - 它可以是布尔值或整数值,具体取决于您需要多少不同的事务。
  2. 在覆盖的 onResumeFragments() 方法中,我检查了我的值,并在进行了我需要的片段事务之后。在这种情况下,在 onSaveInstanceState 之后没有完成 commit(),因为在 onResumeFragments() 方法中返回了状态。
于 2014-09-06T12:39:23.780 回答
5

我用 onconfigurationchanged 解决了这个问题。诀窍是,根据 android 活动生命周期,当您显式调用意图(相机意图或任何其他意图)时;在这种情况下,活动被暂停并调用 onsavedInstance。将设备旋转到活动活动期间以外的其他位置时;进行片段提交等片段操作会导致非法状态异常。有很多抱怨。这是关于 android 活动生命周期管理和适当的方法调用的东西。为了解决这个问题,我这样做了: 1-覆盖您的活动的 onsavedInstance 方法,并确定当前的屏幕方向(纵向或横向),然后在您的活动暂停之前将您的屏幕方向设置为它。这样,您就可以锁定活动的屏幕旋转,以防它被另一个活动旋转。2-然后,覆盖活动的 onresume 方法,并将您的方向模式现在设置为传感器,以便在调用 onsaved 方法后,它将再调用一次 onconfiguration 以正确处理旋转。

您可以将此代码复制/粘贴到您的活动中来处理它:

@Override
protected void onSaveInstanceState(Bundle outState) {       
    super.onSaveInstanceState(outState);

    Toast.makeText(this, "Activity OnResume(): Lock Screen Orientation ", Toast.LENGTH_LONG).show();
    int orientation =this.getDisplayOrientation();
    //Lock the screen orientation to the current display orientation : Landscape or Potrait
    this.setRequestedOrientation(orientation);
}

//A method found in stackOverflow, don't remember the author, to determine the right screen orientation independently of the phone or tablet device 
public int getDisplayOrientation() {
    Display getOrient = getWindowManager().getDefaultDisplay();

    int orientation = getOrient.getOrientation();

    // Sometimes you may get undefined orientation Value is 0
    // simple logic solves the problem compare the screen
    // X,Y Co-ordinates and determine the Orientation in such cases
    if (orientation == Configuration.ORIENTATION_UNDEFINED) {
        Configuration config = getResources().getConfiguration();
        orientation = config.orientation;

        if (orientation == Configuration.ORIENTATION_UNDEFINED) {
        // if height and widht of screen are equal then
        // it is square orientation
            if (getOrient.getWidth() == getOrient.getHeight()) {
                orientation = Configuration.ORIENTATION_SQUARE;
            } else { //if widht is less than height than it is portrait
                if (getOrient.getWidth() < getOrient.getHeight()) {
                    orientation = Configuration.ORIENTATION_PORTRAIT;
                } else { // if it is not any of the above it will defineitly be landscape
                    orientation = Configuration.ORIENTATION_LANDSCAPE;
                }
            }
        }
    }
    return orientation; // return value 1 is portrait and 2 is Landscape Mode
}

@Override
public void onResume() {
    super.onResume();
    Toast.makeText(this, "Activity OnResume(): Unlock Screen Orientation ", Toast.LENGTH_LONG).show();
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
} 
于 2012-08-21T14:23:36.063 回答
4

我遇到了同样的问题,得到了 IllegalStateException,但是用 commitAllowingStateLoss() 替换我对 commit() 的所有调用并没有帮助。

罪魁祸首是对 DialogFragment.show() 的调用。

我用它包围它

try {
    dialog.show(transaction, "blah blah");
}
catch(IllegalStateException e) {
    return;
}

并且做到了。好的,我没有显示对话框,但在这种情况下很好。

这是我的应用程序中唯一一个我第一次调用 FragmentManager.beginTransaction() 但从未调用过 commit() 的地方,所以当我查找“commit()”时我没有找到它。

有趣的是,用户永远不会离开应用程序。相反,杀手是出现的 AdMob 插页式广告。

于 2015-04-09T07:40:25.450 回答
4

我对这个问题的解决方案是

在片段添加方法中:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ...
    guideMapFragment = (SupportMapFragment)a.getSupportFragmentManager().findFragmentById(R.id.guideMap);
    guideMap = guideMapFragment.getMap();
    ...
}

@Override
public void onDestroyView() {
    SherlockFragmentActivity a = getSherlockActivity();
    if (a != null && guideMapFragment != null) {
        try {
            Log.i(LOGTAG, "Removing map fragment");
            a.getSupportFragmentManager().beginTransaction().remove(guideMapFragment).commit();
            guideMapFragment = null;
        } catch(IllegalStateException e) {
            Log.i(LOGTAG, "IllegalStateException on exit");
        }
    }
    super.onDestroyView();
}

可能很糟糕,但找不到更好的东西。

于 2013-05-10T13:17:00.653 回答
4

我遇到了这个问题。但我认为这个问题与 commit 和 commitAllowStateLoss 无关。

以下堆栈跟踪和异常消息是关于 commit()。

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1341)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1352)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)

但是这个异常是由 onBackPressed() 引起的

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(Unknown Source)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(Unknown Source)
at android.support.v4.app.FragmentActivity.onBackPressed(Unknown Source)

它们都是由 checkStateLoss() 引起的

private void checkStateLoss() {
    if (mStateSaved) {
        throw new IllegalStateException(
                "Can not perform this action after onSaveInstanceState");
    }
    if (mNoTransactionsBecause != null) {
        throw new IllegalStateException(
                "Can not perform this action inside of " + mNoTransactionsBecause);
    }

mStateSaved 将在 onSaveInstanceState 之后为真。

这个问题很少发生。我从来没有遇到过这个问题。我不能再次出现这个问题。

我发现问题 25517

可能发生在以下情况

  1. 在 onSaveInstanceState 之后,但在新活动开始之前调用返回键。

  2. 在代码中使用 onStop()

我不确定问题的根源是什么。所以我用了一种丑陋的方式。

@Override
public void onBackPressed() {

    try{
        super.onBackPressed();
    }catch (IllegalStateException e){
        // can output some information here
        finish();
    }
}
于 2016-08-16T10:28:34.320 回答
4

我在我的应用程序中遇到了同样的问题。我已经解决了这个问题,只需调用super.onBackPressed();上一个类并commitAllowingStateLoss()使用该片段调用当前类。

于 2017-02-20T08:42:39.377 回答
3

如果用户旋转屏幕以便加载与新方向关联的资源,则将调用 onSaveInstance。

该用户可能旋转了屏幕,然后按下了返回按钮(因为该用户也可能在使用您的应用程序时摸索了他们的手机)

于 2011-12-26T22:22:44.673 回答
2

阅读 http://chris-alexander.co.uk/on-engineering/dev/android-fragments-within-fragments/

文章。fragment.isResumed() 检查有助于我在 onDestroyView 中使用 onSaveInstanceState 方法。

于 2013-04-18T09:24:02.280 回答
2

我也遇到了同样的问题,经过一天对所有文章、博客和 stackoverflow 的分析,我找到了一个简单的解决方案。根本不要使用 savedInstanceState ,这是一行代码的条件。在片段代码上:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(null);
    .....
于 2016-03-15T13:59:22.020 回答
2

每当您尝试加载片段但活动已将其状态更改为 onPause() 时,就会发生这种情况。例如,当您尝试获取数据并将其加载到活动时会发生这种情况,但当用户单击某个按钮并具有移至下一个活动。

您可以通过两种方式解决此问题

您可以使用 transaction.commitAllowingStateLoss() 而不是 transaction.commit() 来加载片段,但最终可能会丢失已完成的提交操作。

或者

确保活动处于恢复状态并且在加载片段时不会暂停状态。创建一个布尔值并检查活动是否不会进入 onPause() 状态。

@Override
public void onResume() {
    super.onResume();
    mIsResumed = true;
}

@Override
public void onPause() {
    mIsResumed = false;
    super.onPause();
}

然后在加载片段时检查是否存在活动并仅在活动处于前台时加载。

if(mIsResumed){
 //load the fragment
}
于 2017-09-27T09:58:18.470 回答
2

另一种解决问题的生命周期方法是使用最新发布的生命周期-ktx 和 kotlin。

lifecycleScope.launchWhenResumed {
    // your code with fragment or dialogfragment
}

关闭将在恢复状态后运行,因此即使在停止后调用此方法,它也会在下一次恢复时安全执行。

你也可以选择喜欢

lifecycleScope.launchWhenCreated
// or
lifecycleScope.launchWhenStarted

以适应您的情况。

当销毁到来时,代码将被取消。

谷歌文档链接: https ://developer.android.com/kotlin/ktx#lifecycle

于 2021-03-19T13:58:25.330 回答
1

谢谢@gunar,但我认为有更好的方法。

根据文档:

 * If you are committing a single transaction that does not modify the
 * fragment back stack, strongly consider using
 * {@link FragmentTransaction#commitNow()} instead. This can help avoid
 * unwanted side effects when other code in your app has pending committed
 * transactions that expect different timing.
 *
 * @return Returns true if there were any pending transactions to be
 * executed.
 */
public abstract boolean executePendingTransactions();

所以使用commitNow替换:

fragmentTransaction.commit();
FragmentManager.executePendingTransactions()
于 2017-08-28T08:52:04.790 回答
0

经过一番研究,这个问题的解决方案是在 onresume 中进行片段提交。

来源:https ://wenchaojames.wordpress.com/2013/01/12/illegalstateexception-from-onactivityresult/

于 2015-03-06T10:14:32.460 回答
0

好吧,在尝试了上述所有解决方案都没有成功之后(因为基本上我没有交易)。

在我的情况下,我使用 AlertDialogs 和 ProgressDialog 作为片段,有时在旋转时,当请求 FragmentManager 时,错误会上升。

我找到了一种混合一些类似帖子的解决方法:

它是一个 3 步解决方案,全部在您的 FragmentActivity 上完成(在这种情况下,它称为 GenericActivity):

private static WeakReference<GenericActivity> activity = null; //To avoid bug for fragments: Step 1 of 3

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    //To avoid bug for fragments: Step 2 of 3
    activity = new WeakReference<GenericActivity>(this);
}

@Override
public FragmentManager getSupportFragmentManager(){
    //To avoid bug for fragments: Step 3 of 3
    if (this == activity.get()) {
        return super.getSupportFragmentManager();
    }
    return activity.get().getSupportFragmentManager();
}
于 2013-09-19T20:27:06.110 回答
0

当我在一个片段中使用 startactivity 时,我会得到这个异常;

当我更改为使用 startactivityforresult 时,异常消失了:)

所以修复它的简单方法是使用 startActivityForResult api :)

于 2013-12-20T06:32:52.773 回答
0
于 2013-07-12T15:20:00.843 回答
0

当我按下返回按钮以取消地图片段活动上的意图选择器时,我遇到了这个异常。我通过将 onResume()(我在其中初始化片段并提交事务)的代码替换为 onStart() 解决了这个问题,并且应用程序现在运行良好。希望能帮助到你。

于 2014-07-14T11:44:15.553 回答
0

您可能正在调用 fragmentManager.popBackStackImmediate(); 当活动暂停时。活动未完成但已暂停且不在前台。您需要在 popBackStackImmediate() 之前检查活动是否暂停。

于 2017-04-24T14:40:09.800 回答
0

就我而言,具有相同的错误异常,我将“onBackPressed()”放入可运行文件中(您可以使用任何视图):

myView.post(new Runnable() {
                    @Override
                    public void run() {
                        onBackPressed()
                    }
                });

我不明白为什么,但它有效!

于 2017-02-08T15:42:19.723 回答
0

我的用例:我在片段中使用了监听器来通知活动发生了一些事情。我在回调方法上做了新的片段提交。这在第一次时效果很好。但是在方向更改时,将使用保存的实例状态重新创建活动。在这种情况下,不再创建片段意味着片段具有已被破坏的旧活动的侦听器。无论如何,回调方法都会在操作时触发。它会破坏导致问题的活动。解决方案是使用当前实时活动重置片段中的侦听器。这解决了问题。

于 2016-09-02T12:18:12.200 回答
0

我注意到一件非常有趣的事情。我在我的应用程序中有打开手机图库的选项,并且设备询问要使用什么应用程序,我点击对话框之外的灰色区域并看到了这个问题。我注意到我的活动是如何从 onPause、onSaveInstanceState 回到 onResume 的,它不会碰巧访问 onCreateView。我在 onResume 做交易。所以我最终做的是设置一个标志被否定 onPause,但在 CreateView 上是真的。如果标志为真 onResume 则执行 onCommit,否则执行 commitAllowingStateLoss。我可以继续浪费很多时间,但我想检查生命周期。我有一个 sdkversion 23 的设备,我没有遇到这个问题,但我有另一个 21 的设备,我看到了。

于 2017-11-17T13:34:53.993 回答
0

我发现如果另一个应用程序是对话框类型并允许将触摸发送到后台应用程序,那么几乎所有后台应用程序都会因此错误而崩溃。我认为我们需要在每次执行事务时检查实例是否已保存或恢复。

于 2016-10-04T05:00:27.810 回答
-1

您可以在 popBackStackImmediate 之前使用 FragmentActivity.onStart

像这样:

public void backStackFragment() {
    this.start();
    getFragmentManager().popBackStackImmediate();
}

public void start(){
    FragmentActivity a = getActivity();
    if(a instanceof DepositPlanPadActivity){
      ((DepositPlanPadActivity)a).onStart();
    }
    if(a instanceof SmallChangePlanPad){
            ((SmallChangePlanPad)a).onStart();
        }
        if(a instanceof UserCenterActivity){
            ((UserCenterActivity)a).onStart();
        }
    }

http://joryliu.blogspot.com/2014/09/illegalstateexception-can-not-perform.html

于 2014-09-04T07:38:04.740 回答
-2

我认为FragmentActivity.onStateNotSaved()在这些操作之前调用可能是现在最好的选择。

于 2017-05-24T19:22:55.963 回答