NullPointerException relacionado con FragmentManager.popBackStack. ¿Cómo resolver?
Tengo una aplicación de Android donde tengo una actividad y una pila de fragmentos.
Utilizando Crashlytics, he recibido una sola instancia de la siguiente Exception
:
- "Java.lang.NullPointerException" al intentar instalar Android SDK
- La aplicación se bloquea al intentar establecer una conexión VPN?
- Excepción de puntero nulo creando un nuevo proyecto Android Studio (virtualToIoFile)
- Intentar invocar método virtual
- Actividad de captura de cámara Android devuelve null Uri
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.FragmentManager.popBackStack(java.lang.String, int)' on a null object reference at com.company.app.Fragment$7$2.onClick(Fragment.java:397) at android.view.View.performClick(View.java:5197) at android.view.View$PerformClick.run(View.java:20926) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5942) at java.lang.reflect.Method.invoke(Method.java) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
El código que produce este error es:
okButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); // The next line produces the Exception getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); new Handler().postDelayed(new Runnable() { @Override public void run() { // Other code... }, 250); } });
Sobre la base de las pruebas que he realizado con esta aplicación, el usuario para el que se produjo esta excepción y el hecho de que sólo se ha producido una vez, estoy pensando que esta Exception
produce cuando se produce alguna extraña consolidación de circunstancias. (Básicamente, no puedo reproducir esta Exception
en mi final.) Estoy asumiendo que esto tiene que ver con el usuario de fondo de mi aplicación y luego reanudarlo en un momento posterior, y luego la llamada getFragmentManager()
devuelve un null
.
Por lo tanto, sé que puedo "arreglar" esto con un código como el siguiente (encontrado esto como una corrección aplicada a un repositorio de GitHub):
FragmentManager fm = getFragmentManager(); if (fm != null) fm.popBackStack();
Aunque me doy cuenta de que el código anterior "arreglará" el problema en que evitará el NPE
, (por lo tanto, detener la aplicación de estrellarse), no realmente "solucionar" el problema al permitir que mi aplicación para funcionar como desee. El Fragment
en cuestión es # 3 en una pila de fragmentos, como este:
#1 --> #2 --> #3
El comportamiento deseado para la aplicación es responder a este botón haciendo clic en haciendo estallar de nuevo al Fragment
# 1 siendo visible. Simplemente añadir en el código anterior parece que mantendría la aplicación de estrellarse, pero no cambiar la interfaz de usuario de la aplicación de la manera deseada.
¿Qué estoy haciendo mal de tal manera que cuando mi aplicación se reanuda, es "estado de fragmento" está fuera de control?
- NullPointerException en SearchView con AppCompat en Android 5.0
- NullPointerException - Intenta obtener la longitud de la matriz null (readDirectory ())
- Touch Calculator en Android
- AlertDialog en Android - Excepción de puntero nulo
- Android java.lang.IllegalArgumentException
- ¿Por qué estoy obteniendo nullpointer en onMeasure en GridView
- NullPointerException en android.app.ActivityThread.handleStopActivity
- ¿Cuál es el uso principal de "Añadir contrato de método a ..." Android Studio
Nunca he hecho frente a un problema con el getFragmentManager () que es null así que estoy asumiendo que es la parte del popBack de la declaración que está causando el problema. Aquí hay una solución posible para evitar un bloqueo y manejar las excepciones. Si sólo ocurrió una vez, puede haber sido un caso raro.
okButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (getSupportFragmentManager() != null) { // Assuming the getFragmentManager() is not the Issue, rather the popBackStack is the issue try { getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } catch (Exception e) { // Recreate a new instance of your first fragment here. } } else { /* getFragmentManager() == null I have never faced an issue when getFragmentManager() == null, but I would restart the activity if that is the case */ } new Handler().postDelayed(new Runnable() { @Override public void run() { } }, 250); } });
- Cómo codificar un WAV a un mp3 en un dispositivo Android
- Cómo escribir datos Exif usando la clase de cámara personalizada en android?