onResume () no se llama en el fragmento de ViewPager cuando se usa un cargador personalizado
Version corta:
Tengo un fragmento que mantiene unViewPager
para mostrar otros dos fragmentos, llamémoslosFragmentOne
yFragmentTwo
. Al iniciar la aplicaciónFragmentOne
es visible yFragmentTwo
está fuera de la pantalla, haciéndose visible solo cuando se desliza la vista hacia la izquierda.
NormalmenteonStart()
yonResume()
invocarse inmediatamente para ambos fragmentos tan pronto como se inicie la aplicación.
El problema que tengo es cuandoFragmentOne
comienza una costumbreLoader
entoncesonResume()
no es llamado enFragmentTwo
Hasta que sea completamente visible.
Preguntas:
¿Es este un problema con mi código o un error en la biblioteca de soporte de Android? (El problema no se produjo con la revisión 12 de la biblioteca, comenzó con la revisión 13).
Si es un error en las revisiones 13 y 18, ¿hay alguna solución?
¿Hay algo malo con mi costumbre?Loader
?
Versión larga:
He construido una aplicación de ejemplo que demuestra el problema. He intentado reducir el código al mínimo, pero aún así es mucho, así que por favor, tengan paciencia conmigo.
tengo unMainActivity
que carga unMainFragment
que crea unViewPager
. Es importante para mi aplicación que ViewPager sea mantenido por un Fragmento en lugar de una Actividad.
MainFragment
crea unFragmentPagerAdapter
que a su vez crea los fragmentosFragmentOne
yFragmentTwo
.
Empecemos con lo interesante, los dos fragmentos:
FragmentOne
es unListFragment
que usa una costumbreLoader
para cargar el contenido:
public class FragmentOne extends ListFragment implements LoaderCallbacks<List<String>> {
private ArrayAdapter<String> adapter;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1);
setListAdapter(adapter);
setEmptyText("Empty");
}
@Override
public void onResume() {
super.onResume();
// initializing the loader seems to cause the problem!
getLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<List<String>> onCreateLoader(int id, Bundle args) {
return new MyLoader(getActivity());
}
@Override
public void onLoadFinished(Loader<List<String>> loader, List<String> data) {
adapter.clear();
adapter.addAll(data);
}
@Override
public void onLoaderReset(Loader<List<String>> loader) {
adapter.clear();
}
public static class MyLoader extends AsyncTaskLoader<List<String>> {
public MyLoader(Context context) {
super(context);
}
@Override
protected void onStartLoading() {
forceLoad();
}
@Override
public List<String> loadInBackground() {
return Arrays.asList("- - - - - - - - - - - - - - - - - - - foo",
"- - - - - - - - - - - - - - - - - - - bar",
"- - - - - - - - - - - - - - - - - - - baz");
}
}
}
Eso esLoader
Eso parece causar el problema. Comentando elinitLoader La línea hace que el fragmento del ciclo de vida funcione como se espera nuevamente.
FragmentTwo
cambia su contenido basado en sionResume()
ha sido invocado o no:
public class FragmentTwo extends Fragment {
private TextView text;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
text = new TextView(container.getContext());
text.setText("onCreateView() called");
return text;
}
@Override
public void onResume() {
super.onResume();
Log.i("Fragment2", "onResume() called");
text.setText("onResume() called");
}
}
Y aquí está el resto aburrido del código.
MainActivity
:
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fragment fragment = new MainFragment();
getSupportFragmentManager().beginTransaction().add(R.id.container, fragment).commit();
}
}
Diseñoactivity_main
:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
MainFragment
:
public class MainFragment extends Fragment {
private ViewPager viewPager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.frag_master, container, false);
viewPager = (ViewPager) layout.findViewById(R.id.view_pager);
return layout;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
viewPager.setAdapter(new MyPagerAdapter(getChildFragmentManager()));
}
private static final class MyPagerAdapter extends FragmentPagerAdapter {
public MyPagerAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public int getCount() {
return 2;
}
@Override
public Fragment getItem(int position) {
if (position == 0)
return new FragmentOne();
else
return new FragmentTwo();
}
}
}
Diseñofrag_master
:
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />