viewpager tablayout fragments example android android-fragments fragmentpageradapter

android - tablayout - FragmentPagerAdapter-¿Cómo manejar los cambios de orientación?



viewpager android (3)

Uso un FragmentPagerAdapter contiene varios fragmentos que deben ser notificados sobre los cambios en la database . Lo hago iterando sobre los fragmentos, que implementan una interfaz de devolución de llamada, y llamando a un método refreshData() .

Esto funciona bien hasta que el dispositivo cambia de orientación. Después de un cambio de orientación, la IU del fragmento no se actualiza visiblemente aunque la llamada al método parece funcionar.

Por lo que he leído hasta ahora, esto ocurre porque FragmentPagerAdapter maneja el ciclo de vida del fragmento y los fragmentos que reciben la devolución de llamada no son los que realmente se muestran.

private class DataPagerAdapter extends FragmentPagerAdapter { private DataFragment[] fragments = new DataFragment[] { new FooDataFragment(), BarDataFragment()}; public DataPagerAdapter(android.support.v4.app.FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return fragments[position]; } @Override public int getCount() { return fragments.length; } public DataFragment[] getFragments() { return fragments; } } protected void refreshData() { for (DataFragment dataFragment : mPagerAdapter.getFragments()) { dataFragment.refreshData(); }

Solucioné temporalmente este problema usando un receptor de difusión dentro de cada fragmento, pero esta solución parece ser un desperdicio y podría crear pérdidas de memoria. ¿Cómo puedo solucionar esto correctamente? Uso un diseño y una lógica diferentes en modo horizontal, por lo que quiero usar los fragmentos recién creados después de un cambio de orientación.


¿No podría simplemente establecer el indicador de android: configChanges en su Actividad en AndroidManifest.xml para evitar que la actividad se vuelva a crear?

<activity android:name="com.example.test.activity.MainActivity" android:configChanges="orientation|screenSize|keyboardHidden"/>

también puede encontrar más posibilidades: https://android.jlelse.eu/handling-orientation-changes-in-android-7072958c442a


Sí, como ha dicho, FragmentManager maneja los fragmentos después del cambio de orientación, por lo que no se llama a getItem en el adaptador. Pero puede anular el método instantiateItem() que se llama incluso después del cambio de orientación y convertir Objeto en Fragmento y guardarlo en su matriz.

@Override public Object instantiateItem(ViewGroup container, int position) { DataFragment fragment = (DataFragment) super.instantiateItem(container, position); fragments[position] = fragment; return fragment; }


Tuve un problema similar en mi solución de trabajo: en la actividad donde está un adaptador adapter.notifyDataSetChanged();

sobrescriba el método getItemPostion () en su adaptador

@Override public int getItemPosition(Object object) { MyFragment frag = (MyFragment)object; frag.refresh(); return POSITION_UNCHANGED; }

mi FragmentStatePagerAdapater (mi adaptador) contiene solo un tipo de fragmento, pero creo que podría usar instanceof (para más tipos de fragmentos) y luego usar cast o cada fragmento implementará la interfaz con el método refresh()

Luego agregue el método refresh() en su (s) Fragmento (s) y use esta implementación:

public void refresh() { LayoutInflater inflater = LayoutInflater.from(getActivity()); ViewGroup viewGroup = (ViewGroup) getView(); viewGroup.removeAllViewsInLayout(); View view = onCreateView(inflater, viewGroup, null); viewGroup.addView(view); }

Esto funcionó para mí. Mi opinión: el problema surgió, cuando el dispositivo cambia de orientación, el adaptador se destruye, pero los fragmentos aún están en la memoria y el sistema intenta reutilizarlos después del cambio de orientación, pero las vistas que se encuentran en los fragmentos también se destruyen y los fragmentos necesitan para ser "recreate" (llamar onCreateView método onCreateView ). Tal vez me equivoque, por favor corríjame ....

(Lo siento por mi ingles )