DialogFragment - nicht diese Aktion auszuführen, nachdem onSaveInstanceState

Entwickle ich ein launcher-Anwendung, die zeigt, dass ein dialogfragment, wenn der Benutzer authentifiziert sich. Die meisten der Zeit ist dies funktioniert gut, aber manchmal bin ich mit diesem Fehler melden:

02-07 18:55:56.619: E/AndroidRuntime(1300): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1280)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1291)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.BackStackRecord.commitInternal(BackStackRecord.java:548)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.BackStackRecord.commit(BackStackRecord.java:532)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.DialogFragment.dismissInternal(DialogFragment.java:292)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.DialogFragment.dismiss(DialogFragment.java:258)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at com.blablabla.android.app.fragments.login.LoginResultFragment$CloseDialogRunnable.run(LoginResultFragment.java:59)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.os.Handler.handleCallback(Handler.java:615)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.os.Looper.loop(Looper.java:137)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.ActivityThread.main(ActivityThread.java:4745)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at java.lang.reflect.Method.invokeNative(Native Method)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at java.lang.reflect.Method.invoke(Method.java:511)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at dalvik.system.NativeStart.main(Native Method)

Ich gesucht habe in anderen threads, für Beispiel und folgte Ihrer Anregungen, aber es ist immer noch nicht für mich arbeiten

Meine dialogfragment aussieht:

public class LoginResultFragment extends DialogFragment implements
        OnClickListener {

    private CloseDialogRunnable runnable = null;

    public class CloseDialogRunnable implements Runnable {
        /**
         * https://stackoverflow.com/questions/5844308/removecallbacks-not-
         * stopping-runnable
         */
        private boolean killCloseActivityRunnable = false;

        public void killRunnable() {
            killCloseActivityRunnable = true;
        }

        @Override
        public void run() {
            if (killCloseActivityRunnable) {
                return;
            }
            if (getDialog()!=null && getDialog().isShowing()) {             
                    dismiss();              
            }
        }
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        if (runnable != null){      
            runnable.killRunnable();
            handler.removeCallbacks(runnable);
        }
        super.onDismiss(dialog);
    }

    /** Milliseconds until we dismiss the timeout */
    private static final long DISMISSING_TIMEOUT = 2000;

    /** Dismissing window handler */
    private final Handler handler = new Handler();

    private LoginResultFragment() {
    }

    public static LoginResultFragment getInstance(
            Map<String, Object> currentValues) {
        LoginResultFragment result = new LoginResultFragment();

        set extra fields...

        return result;
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setStyle(DialogFragment.STYLE_NO_FRAME,
                android.R.style.Theme_Holo_Dialog);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        setRetainInstance(true);
        rootView = inflater.inflate(R.layout.fragment_login_result, container);

        getDialog().getWindow().setBackgroundDrawable(
                new ColorDrawable(android.graphics.Color.TRANSPARENT));

        do UI stuff...

        dismissAfterTimeout();
        return rootView;
    }

    private void dismissAfterTimeout() {
        runnable = new CloseDialogRunnable();
        handler.postDelayed(runnable, DISMISSING_TIMEOUT);

    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
    }

}

Und ich rufe es mit:

final android.app.FragmentTransaction trans = activity
                .getFragmentManager().beginTransaction();
        trans.add(fragment, fragment.getClass().getCanonicalName());
        trans.commitAllowingStateLoss();
Können Sie weitere Details hinzufügen, wo Sie die FragmentTransaction? Ich sehe, Sie sind das hinzufügen, das fragment zu den Transaktions-manager, aber sind Sie auf hinzufügen, um das layout? Was als Nächstes passiert, vielleicht Fall die onSaveInstanceState() aufgerufen wird, auf das Fragment (pause, beenden Aktivität, etc.)?
Hi jacobhyphenated, vielen Dank für Ihren Kommentar. Ich bin nicht hinzufügen, das fragment auf das layout, da zeige ich es wie ein dialog (es ist ein DialogFragment). Ich zeige es, wenn ich einige login-Informationen aus anderen Verfahren.
mögliche Duplikate von Zeige DialogFragment aus onActivityResult
Ich habe eine alternative Lösung zu DialogFragment, dass um dies zu vermeiden, Ausnahme : github.com/AndroidDeveloperLB/DialogShard

InformationsquelleAutor Guillermo Merino | 2014-02-07

Schreibe einen Kommentar