【问题标题】:java.lang.IllegalStateException: commit already calledjava.lang.IllegalStateException:已调用提交
【发布时间】:2015-06-26 21:13:20
【问题描述】:

我试过下面的代码,

try {
    final Activity activity = ctx;
    FragmentTransaction ft = activity.getFragmentManager().beginTransaction();
    android.app.Fragment prev = activity.getFragmentManager().findFragmentByTag("dialog");
    if (prev != null) {
        ft.remove(prev);
    }
    DialogServiceFailed newFragment = DialogServiceFailed.newInstance(pageName, onServiceFailed);
    newFragment.show(ft, "dialog");
    ft.addToBackStack(null);
    ft.commitAllowingStateLoss();
} catch (ClassCastException e) {
    Log.d("Log", "Can't get the fragment manager with this");
}

但是我得到以下异常并且我的应用程序崩溃了。

java.lang.IllegalStateException: commit already called
        at android.app.BackStackRecord.commitInternal(BackStackRecord.java:582)
        at android.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)
        at com.brightspot.extrain5psim.model.APIRequestHandler.loadServiceFailedDialog(APIRequestHandler.java:99)
        at com.brightspot.extrain5psim.view.fragments.LoginFragment.setOnAsyncTaskCompleted(LoginFragment.java:201)
        at com.brightspot.extrain5psim.model.APIRequestHandler.onPostExecute(APIRequestHandler.java:80)
        at com.brightspot.extrain5psim.model.APIRequestHandler.onPostExecute(APIRequestHandler.java:17)
        at android.os.AsyncTask.finish(AsyncTask.java:631)
        at android.os.AsyncTask.access$600(AsyncTask.java:177)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:176)
        at android.app.ActivityThread.main(ActivityThread.java:5317)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
        at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: java android


    【解决方案1】:
    newFragment.show(ft, "dialog")
    

    show 调用内部提交。所以你可能想摆脱

    ft.commitAllowingStateLoss();
    

    或者你可以摆脱

    newFragment.show(ft, "dialog");
    

    添加调用

    ft.add(newFragment, "dialog");
    ft.commitAllowingStateLoss();
    

    编辑

    这就是DialogFragmentshow() 的样子

     public int show(FragmentTransaction transaction, String tag) {
            mDismissed = false;
            mShownByMe = true;
            transaction.add(this, tag);
            mViewDestroyed = false;
            mBackStackId = transaction.commit();
            return mBackStackId;
    }
    

    【讨论】:

    • 在某些时候我得到了this 异常兄弟。这就是我添加这一行的原因。如果我删除了ft.commitAllowingStateLoss(); 行,那么如何避免此异常?
    • 如果我摆脱 show 那么我该如何显示对话框兄弟。抱歉,如果这是个愚蠢的问题。
    • commitAllowingStateLoss 应该注意显示您的 DialogFragment
    猜你喜欢
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2021-08-09
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    相关资源
    最近更新 更多