Cuando intento dissmiss un FragmentDialog, mi aplicación se cuelga a veces.
Aquí está el log:

Process: com.xxx, PID: 9981
java.lang.RuntimeException: Error receiving broadcast Intent { act=xxxx flg=0x10 (has extras) } in xxxxxx
    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:893)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5438)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.FragmentTransaction android.app.FragmentManager.beginTransaction()' on a null object reference
    at android.app.DialogFragment.dismissInternal(DialogFragment.java:296)
    at android.app.DialogFragment.dismissAllowingStateLoss(DialogFragment.java:277)
    at xxxxx.updateStatus(BaseAppCompatActivity.java:96)
    at xxxxx.access$000(BaseAppCompatActivity.java:43)
    at xxxxx$1.onReceive(BaseAppCompatActivity.java:79)
    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:883)

xxxxx.updateStatus(BaseAppCompatActivity.java:96)
esta línea es intentar despedir a un DialogFragment:

mDialogFragment.dismissAllowingStateLoss();

Un DialogFragment es en mi Actividad.

private SimpleBlockedDialogFragment mDialogFragment = SimpleBlockedDialogFragment.newInstance();

Así mDialogFragment no es null.

Puedo mostrar cuadro de diálogo como este:

FragmentTransaction ft = getFragmentManager().beginTransaction();
mDialogFragment.updateMessage("xxx");
mDialogFragment.show(ft, "block_dialog");

Y despedir cuadro de diálogo como este:

mDialogFragment.dismissAllowingStateLoss();

A veces, me diálogo mostrar sólo una vez, pero despedir a más de una vez. Pero no creo que causar un accidente.

Aquí está el dismissInternal función en la DialogFragment:

void dismissInternal(boolean allowStateLoss) {
    if (mDismissed) {
        return;
    }
    mDismissed = true;
    mShownByMe = false;
    if (mDialog != null) {
        mDialog.dismiss();
        mDialog = null;
    }
    mViewDestroyed = true;
    if (mBackStackId >= 0) {
        getFragmentManager().popBackStack(mBackStackId,
                FragmentManager.POP_BACK_STACK_INCLUSIVE);
        mBackStackId = -1;
    } else {
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.remove(this);
        if (allowStateLoss) {
            ft.commitAllowingStateLoss();
        } else {
            ft.commit();
        }
    }
}

de registro me dice que getFragmentManager() devuelve null. No sé por qué pasó esto.
Cómo despedir a un FragmentDialog correctamente?

actualización:
Yo trato de android.apoyo.v4.app.FragmentTransaction, y aún así obtener una excepción.

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentTransaction android.support.v4.app.FragmentManager.beginTransaction()' on a null object reference
    at android.support.v4.app.DialogFragment.dismissInternal(DialogFragment.java:196)
    at android.support.v4.app.DialogFragment.dismissAllowingStateLoss(DialogFragment.java:177)

Ayudar a~

Posibles duplicados de ¿Qué es una Excepción de Puntero Nulo, y cómo puedo solucionarlo?
este NullPointerException sucedió en el marco android.
¿Qué te hace pensar así?
en android.app.DialogFragment.dismissInternal(DialogFragment.java:296). dismissAllowingStateLoss se llame dismissInternal, y no params.
Uso getSupportFragmentManager en lugar de getFragementManager.

OriginalEl autor android_su | 2016-05-20

2 Comentarios

  1. 1

    Intentar getSupportFragmentManager().beginTransaction(); esto puede ayudar.

    gracias, voy a probar. Pero ¿por qué debo usar android.apoyo.v4.app.FragmentTransaction en lugar de android.app.FragmentTransaction?

    OriginalEl autor UserSharma

  2. 0
      PopUpDialog popUpDialog = new PopUpDialog();
      popUpDialog.show(getSupportFragmentManager();
      PopUpDialog.class.getSimpleName());

    Usar esto funciona para mí.

    OriginalEl autor Alok Singh

Dejar respuesta

Please enter your comment!
Please enter your name here