Los miembros de la clase en Fragmento se convierten en nulos después de pulsar el botón Inicio y esperar

Descripción del problema

La aplicación que estoy escribiendo tiene 3 Fragmentos. Actividad principal del fragmento tiene un cuadro de búsqueda con el botón de búsqueda cuando presiono un botón de búsqueda la función de abajo se llama:

Fragments.values()[tabControl.getCurrentItem()].getFragment().search(tv.getText().toString(), MainActivity.this.getApplicationContext()); 

Todo funciona Bien hasta que presione el botón HOME esperar 30 minutos y relanzar la aplicación, después de presionar el botón de búsqueda en FragmentYellowPages Fragmento aplicación se bloquea en las líneas

 lvYellowPages.setVisibility(View.VISIBLE); 

Como lvYellowPages en este caso es nulo, pero en un registro puedo ver que onCreateView función se llama. Puede por favor ayudarme, puedo compartir mi código con usted.


FragmentPagerAdapter

 public class FragmentAdapter extends FragmentPagerAdapter { Fragments[] mFragments; public FragmentAdapter(FragmentManager fm) { super(fm); mFragments = Fragments.values(); } public enum Fragments { Favorites(App.getStringByResId(R.string.favorites), new FragmentFavorites()), Categories(App.getStringByResId(R.string.categories), new FragmentCategories()), YellowPages(App.getStringByResId(R.string.yellow_pages), new FragmentYellowPages()); Fragments(String title, BaseListFragment fragment) { this.mTitle = title; this.mFragment = fragment; } String mTitle; BaseListFragment mFragment; public String getTitle() { return mTitle; } public BaseListFragment getFragment() { return mFragment; } }; @Override public CharSequence getPageTitle(int position) { return mFragments[position].getTitle(); } @Override public Fragment getItem(int position) { return mFragments[position].getFragment(); } @Override public int getCount() { return mFragments.length; } }; 

Fragmento de lista

 public class FragmentYellowPages extends BaseListFragment { final static String TAG = FragmentYellowPages.class.getSimpleName(); ListView lvYellowPages; TextView tvInfo; SimpleCursorAdapter scAdapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View yellowPagesView = inflater.inflate(R.layout.fragment_yellow_pages, container, false); Log.i(TAG, "onCreateView( )"); tvInfo = (TextView) yellowPagesView.findViewById(R.id.tvYellowPagesInfo); lvYellowPages = (ListView) yellowPagesView.findViewById(android.R.id.list); return yellowPagesView; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "onCreate( )"); setRetainInstance(true); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.i(TAG, "onActivityCreated( )"); } @Override public void onResume() { super.onResume(); Log.i(TAG, "onResume( )"); } void updateAdapterOnSearch(final String tts, final String lang) { Log.i(TAG, String.format("updateAdapterOnSearch(%s, %s)", tts, lang)); /* Show "Yellow Pages" list view and hide Info text view. */ lvYellowPages.setVisibility(View.VISIBLE); tvInfo.setVisibility(View.GONE); /* Some code .... */ } @Override public void search(final String tts, final Context context) { Log.i(TAG, String.format("search(%s)", tts)); /* If user search for the text. */ if (tts != null && tts.length() != 0) { updateAdapterOnSearch(tts, lang); } } }; 

Disposición del fragmento

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffc8" android:tag="FRAGMENT_YELLOW_PAGES_TAG" > <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" android:background="#ffffc8"/> <TextView android:id="@+id/tvYellowPagesInfo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:gravity="center" android:padding="5dp" android:text="@string/no_companies_were_found" android:visibility="gone"/> </RelativeLayout> 

Es difícil identificar el problema exacto, pero estoy casi seguro de que tiene que ver con la forma en que construyó el adaptador para ViewPager .

Todo funciona Bien hasta que presione el botón HOME esperar 30 minutos y volver a iniciar la aplicación, después de presionar el botón de búsqueda en FragmentYellowPages Fragmento aplicación se bloquea

Como la Activity está en el fondo (y aparentemente asesinada) recreará su contenido cuando regrese al primer plano. En este punto el ViewPager reconstruirá su contenido, pero su adaptador no llamará getItem() ya que tiene todos los datos para recrear los fragmentos anteriores en su propio. Así que terminarás con dos fragmentos de la versión, los que están actualmente visibles en el ViewPager (para que vea el onCreateView() se llama) y los que están en el enum . Esos fragmentos del enum no están vinculados a la Activity y por lo tanto no se ejecuta la pila de devolución de llamada completa para ellos, por lo que onCreateView() no se llamará, lo que hará su lvYellowPages ListView null .

Por cierto, esta es la primera vez que he visto los fragmentos de un adaptador que se está construyendo en un enum y le recomiendo que evite esto.

La solución es no hacer referencia a los fragmentos de ViewPager fuera. Haga que el método getItem() devuelva una instancia de Fragment y si necesita acceder a ese fragmento hay maneras de hacerlo sin almacenar el fragmento de ViewPager en listas / enums, etc (una búsqueda rápida en stackoverflow debería mostrarle una pregunta sobre esto) :

 @Override public Fragment getItem(int position) { switch (position) { case 0: return new FragmentFavorites(); case 1: return new FragmentCategories(); case 2: return new FragmentYellowPages(); } return null; } @Override public int getCount() { return 3; } 

También:

 setRetainInstance(true); 

No usaría esto. No tiene sentido retener un fragmento usado por ViewPager (ya que no creo que esté planeando moverlo a otro lugar) y tampoco lo protegerá de la actividad que se está matando en segundo plano.

  • "La aplicación no se ejecutará a menos que actualices los servicios de Google Play" con Google Maps API
  • Reproductor de música Android no reindexando después de la adición de canción
  • Desconcertado por el valor de píxeles en Bitmap (pre multiplicado usando setPixel)
  • Android VMD MySQL insertar y mostrar el diálogo
  • ¿Por qué Java (Android?) Está estableciendo la fecha de la última modificación de mi archivo a mañana?
  • Problemas Android SecretKeyFactory. Implementación no encontrada?
  • ¿Cuáles son los efectos secundarios de la inhabilitación de la inspección LINT?
  • RunOnUiThread No definido para la clase
  • Cómo aclarar u oscurecer un mapa de bits
  • ¿Por qué mis intenciones no se entregan correctamente?
  • No es posible listar plataformas de destino. Asegúrese de que la ruta sdk de Android es correcta
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.