Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


NPE en Fragment.setUserVisibleHint () cuando se utiliza ViewPager

Estoy en una pérdida para esto. Estoy cambiando las pestañas manualmente en mi ViewPager. Tengo este código dentro de mi Actividad:

@Override public void onBackPressed() { if (childFragmentStack.empty()) { // Go to the devices screen Intent intent = new Intent(this, SelectDeviceActivity.class); startActivity(intent); } else { Fragment fragment = childFragmentStack.pop(); if (fragment == null) { return; } processingBackStack = true; if (fragment instanceof ViewChildFragment) { viewFragment.activateFragment((ViewChildFragment) fragment); mViewPager.setCurrentItem(VIEW_FRAGMENT_INDEX, true); } else if (fragment instanceof SetupChildFragment) { setupFragment.activateFragment((SetupChildFragment) fragment); mViewPager.setCurrentItem(SETUP_FRAGMENT_INDEX, true); //** } else if (fragment == homeFragment) { mViewPager.setCurrentItem(HOME_FRAGMENT_INDEX, true); //** } processingBackStack = false; } } 

Si me desplazo entre las pestañas, las agrego a una pila (el 'childFragmentStack'). Estoy utilizando FragmentPagerAdapter para manejar los fragmentos. Lo que sucede es que si hago algo como Ver-> Configuración-> Ver-> Configuración y luego revertirlo, sólo llega hasta Configuración-> Ver-> CRASH. Es como cuando presiono Back the Setup El fragmento ya no es válido para lo que estoy haciendo, pero nunca se vuelve a crear! El fragmento de instalación sólo se crea en MainActivity.onCreate (), por lo que todavía debe ser alrededor y válido.

El NPE ocurre en las líneas marcadas **. Aquí está el rastro completo de la pila:

  04-18 16:04:57.096: E/AndroidRuntime(13072): FATAL EXCEPTION: main 04-18 16:04:57.096: E/AndroidRuntime(13072): java.lang.NullPointerException 04-18 16:04:57.096: E/AndroidRuntime(13072): at android.support.v4.app.Fragment.setUserVisibleHint(Fragment.java:841) 04-18 16:04:57.096: E/AndroidRuntime(13072): at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(FragmentPagerAdapter.java:130) 04-18 16:04:57.096: E/AndroidRuntime(13072): at android.support.v4.view.ViewPager.populate(ViewPager.java:1066) 04-18 16:04:57.096: E/AndroidRuntime(13072): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:550) 04-18 16:04:57.096: E/AndroidRuntime(13072): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:509) 04-18 16:04:57.096: E/AndroidRuntime(13072): at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:501) 04-18 16:04:57.096: E/AndroidRuntime(13072): at com.lochinvar.serf.MainActivity.onBackPressed(MainActivity.java:234) 04-18 16:04:57.096: E/AndroidRuntime(13072): at android.app.Activity.onKeyUp(Activity.java:2131) 04-18 16:04:57.096: E/AndroidRuntime(13072): at android.view.KeyEvent.dispatch(KeyEvent.java:2633) 04-18 16:04:57.096: E/AndroidRuntime(13072): at android.app.Activity.dispatchKeyEvent(Activity.java:2361) 04-18 16:04:57.096: E/AndroidRuntime(13072): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1819) 04-18 16:04:57.096: E/AndroidRuntime(13072): at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3577) 04-18 16:04:57.096: E/AndroidRuntime(13072): at android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:3547) 04-18 16:04:57.096: E/AndroidRuntime(13072): at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2797) 04-18 16:04:57.096: E/AndroidRuntime(13072): at android.os.Handler.dispatchMessage(Handler.java:99) 04-18 16:04:57.096: E/AndroidRuntime(13072): at android.os.Looper.loop(Looper.java:137) 04-18 16:04:57.096: E/AndroidRuntime(13072): at android.app.ActivityThread.main(ActivityThread.java:4745) 04-18 16:04:57.096: E/AndroidRuntime(13072): at java.lang.reflect.Method.invokeNative(Native Method) 04-18 16:04:57.096: E/AndroidRuntime(13072): at java.lang.reflect.Method.invoke(Method.java:511) 04-18 16:04:57.096: E/AndroidRuntime(13072): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 04-18 16:04:57.096: E/AndroidRuntime(13072): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 04-18 16:04:57.096: E/AndroidRuntime(13072): at dalvik.system.NativeStart.main(Native Method) 

[EDIT] Olvidé mencionar que he superado FragmentPagerAdapter.getPageTitle () y nunca devuelve null (el caso predeterminado va a una cadena).

  • Selector de fecha de Android en un diálogo
  • Los mismos fragmentos, edittext y requestfocus emiten
  • Error al inflar el fragmento del diseño android-support-v4
  • Ciclo de vida de Android Fragment sobre cambios de orientación
  • Cómo encontrar la "última página" en un paginador de vista. O el número total de puntos de vista. Desarrollo de Android
  • FragmentPagerAdapter no restaura fragmentos al cambiar de orientación
  • Fragmento sin una vista se bloquea en el cambio de configuración
  • Dilema: cuándo utilizar Fragmentos vs Actividades:
  • 3 Solutions collect form web for “NPE en Fragment.setUserVisibleHint () cuando se utiliza ViewPager”

    ¡Finalmente! ¡Ahora puedo recrear este error de forma fiable!

    Otra forma que encontré para recrear el error es cerrar activity / app, y reabrir rápidamente la página con el fragmento ViewPager. Usted puede tener que probar algunas veces porque en mis pruebas tuve que reabrir la aplicación dentro de unos 30ms. Este tiempo puede ser más lento o más rápido para diferentes dispositivos de velocidad.

    El problema era que sólo explícitamente creé el Fragmento (usando new ) una vez, y mantuve una referencia a esa instancia para poder reutilizarla. Una solución simple a este problema es devolver siempre una new instancia del fragmento FragmentPagerAdapter.getItem(...) , como se muestra a continuación.

     public class ViewPagerAdapter extends FragmentPagerAdapter { ... @Override public Fragment getItem(int position) { switch (position) { case 0: return mMyFragment; // Error. Has the edge-case crash. case 1: return new MyFragment(); // Works. default: return new MyDefaultFragment(); } } } 

    Ps – El problema de la raíz probablemente tiene algo que ver con el ciclo de vida de Fragment y tratando de usarlo de nuevo mientras está siendo destruido.

    Pps – Esta solución corrige NullPointerException para android.app.Fragment.setUserVisibleHint(Fragment.java:997) y también debería funcionar para android.support.v4.app.Fragment.setUserVisibleHint .

    Éste era un verdadero tornado cerebral para mí. Hemos eliminado todo el código que reemplazó el Fragment s y mantuvo los mismos fragmentos durante todo el ciclo de vida de la Activity y todavía tenía este problema. No fue hasta que viewPager.setOffscreenPageLimit(TABS); Donde TABS es el número de fichas (en nuestro caso 4) que dejamos de obtener la referencia NullPointerException .

    FWIW – Estoy bastante seguro de que el problema está en el código de Google. No pudimos hacer que esto fallara en un Nexus 5 ejecutando Lollipop, pero falla en todos los dispositivos Samsung que ejecutan Kitkat. Cuando tracé a través del error en sí, parecía que el fracaso ocurre porque el Fragment se hace referencia ya ha pasado por la función interna Fragment.initState porque el id del Fragment es -1.

    Tuve un mal momento de un caso muy similar (misma excepción en Fragment.setUserVisibleHint ) incluso si he utilizado FragmentStatePagerAdapter. Hubo un bloqueo aleatorio (por lo tanto, difícil de reproducir) de mi aplicación cuando los datos subyacentes estaban cambiados.

    En mi caso, finalmente pude deshacerme de este bloqueo anulando el siguiente método en el adaptador:

     @Override public void restoreState(Parcelable state, ClassLoader loader) { // don't super ! } 

    Creo que hay un error en esta clase, dado el número de preguntas similares a esta en StackOverflow.

    Espero que esto pueda ser útil para alguien.

    Edit: He publicado una respuesta similar a android.support.v4.app.Fragment.setUserVisibleHint puntero nulo en la reanudación de la aplicación sin embargo, no estoy seguro de que estas preguntas son duplicados. Sin embargo, creo que esta respuesta podría ayudar a algunas personas a encontrar estos para un síntoma similar. ¿Cómo debo notar esto?

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.