Intente invocar el método virtual ''android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()'' en una referencia de objeto nula
android-fragments nullpointerexception (7)
Después de mucha investigación, parece que es un problema de la biblioteca de soporte:
Actividad con fragmentos y ViewPager se bloquea en el cambio de configuración
Problema con la biblioteca de soporte de Android 24.1.0
También encontré esta respuesta, pero parece inusual agregar una marca a mi código:
¡ finishUpdate
método finishUpdate
de mi FragmentPagerAdapter
como este y el problema resuelto por ahora!
@Override
public void finishUpdate(ViewGroup container) {
try{
super.finishUpdate(container);
} catch (NullPointerException nullPointerException){
System.out.println("Catch the NullPointerException in FragmentPagerAdapter.finishUpdate");
}
}
¿Alguna mejor respuesta? Por favor hagamelo saber...
Mi aplicación consta de 4 fragmentos como pestañas que se cargan dentro de un fragmento primario usando FragmentPagerAdapter
.
El problema es cuando ejecuto la aplicación y presiono para volver a abrir la aplicación. Recibo este registro de errores:
FATAL EXCEPTION: main
java.lang.NullPointerException: Attempt to invoke virtual method ''android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()'' on a null object reference
at android.support.v4.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:1949)
at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1965)
at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:620)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:513)
...
La línea de código dentro del fragmento principal es:
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
y ViewPage
y Adapter
no son nulos !!
¡Tengo que mencionar que todo el ciclo de vida de mi Fragment
se está gestionando y el problema nulo está ocurriendo dentro del adaptador !, ¡y el mismo Adaptador funciona bien cuando uso una Activity
como padre en lugar de Fragment
!
Estaba usando la referencia de actividad incorrecta para buscar
getSupportFragmentManager ()
El uso de la actividad correcta solucionó el accidente para mí.
Sé que puede ser tarde, pero aquí está mi error estúpido que no vi de inmediato:
@Override
public void onStop() {
super.onDestroy(); //I was calling the wrong super
}
Tengo el mismo problema en mi proyecto. Pero es mi culpa.
POR QUÉ
Llamo a onBackPressed en una devolución de llamada después de que la actividad haya invocado a OnDestroy ();
Debido a que la instancia mHost en FragmentManager está configurada en nula después de que onDestroy () haya llamado.
y cuando llame a onBackPressed, usará la instancia mHost nuevamente.
Tuve el mismo problema y fue causado por la reutilización de la instancia de ViewPager
por diferentes instancias de un fragmento. Una solución fue onDestroyView()
el adaptador en el método onDestroyView()
del fragmento.
@Override public void onDestroyView() {
mViewPager.setAdapter(null);
super.onDestroyView();
}
Proyecto demoing el problema y la solución se puede encontrar aquí .
Tuve el mismo problema. En mi caso, el problema fue que estaba reutilizando sin notar el adaptador de la vez que estaba abierto.
Busqué en la clase FragmentManager.java que envía la excepción y en la misma línea que se bloquea dice: "Debe llamarse desde el hilo principal del fragmento de host"
mi código era:
PagerAdapter adapter = MPageAdapter.getInstance(getSupportFragmentManager());
viewPager.setAdapter(adapter);
porque estaba usando mi PageAdapter como un puente para comunicarme entre los fragmentos, usé un patrón de singleton. Eso me funcionó bien, pero una vez que repetí esta estructura en otra actividad obtuve la misma excepción. Y la razón fue que olvidé destruir el singleton de mi clase de adaptador al final de cada uso.
@Override
protected void onDestroy() {
MPageAdapter.Destroy(); //I forgot this one, that makes singleton = null;
super.onDestroy();
}
@Override
public void onBackPressed() {
// super.onBackPressed();
finish();
}
Anular el onBackPressed
en la actividad ..
eliminar la súper llamada: super.onBackPressed
y llamada final.