Android – Viewpager y fragmentos, los métodos no funcionan
Tengo un ViewPager
con dos Fragments
que instancio en onCreate
de mi FragmentActivity
.
private List<Fragment> fragments = new Vector<Fragment>(); fragments.add(Fragment.instantiate(this,Frag_1.class.getName())); fragments.add(Fragment.instantiate(this,Frag_2.class.getName())); this.vPagerAdapter = new Adapt(super.getSupportFragmentManager(),fragments); vPager = (ViewPager) super.findViewById(R.id.pager); vPager.setAdapter(vPagerAdapter);
Mi segundo Fragment
tiene un método dentro del que llamo para actualizar mi ListView
– refreshList()
:
- Lag al reemplazar el fragmento ViewPager en la barra de navegación sobre FrameLayout?
- Fragment onResume () no se llama cuando se utiliza FragmentPagerAdapter
- Desactivar la animación de desplazamiento de ViewPager
- Efecto de desplazamiento con múltiples visualizadores
- Android ViewPager y TabLayout no funcionan rápido
public class Frag_2 extends Fragment { private ListView list; private ArrayList<data> data; private boolean firstCreation=true; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setRetainInstance(false); } public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.layout, container, false); list = (ListView) view.findViewById(R.id.lst); //this.setRetainInstance(true); return view; } public void refreshList(ArrayList <data> data){ if(data!=null){ ArrayAdapter<data> adapter = new Item_data_adapter(getActivity(),data); list.setAdapter(adapter);} } }
Llamado desde mi FragmentActivity
//Something Frag_2 fr = (Frag_2) vPagerAdapter.getItem(1); if (fr.getView() != null) { fr.refreshList(data); }
Funciona bien hasta que cambie la orientación de la pantalla. Corregirme si me equivoco, pero estaba buscando horas y no encontré una solución o una buena explicación, la FragmentActivity
se crea sólo una vez y los Fragments
se adjuntan a ella, pero los Fragments
recrean en los cambios de configuración. Ahora, cuando la orientación cambia, no obtengo la View
de onCreate
así que cuando intento obtener la View
del Fragment
devuelve null y no se llama a mi método refreshList()
. ¿Cómo puedo arreglar esto?
- Android: la pantalla del fragmento gira
- ViewPager + FragmentStatePageAdapter: ¿qué significa esta advertencia "no actualizada en línea"?
- Android ViewPager Lag
- Android ViewPager con ScrollViews con ViewPagers dentro de ScrollViews
- Después de la rotación, la transacción de fragmentos da IllegalStateException
- La altura de ViewPager en el diseño del Coordinador está más que disponible
- Cambiar de TabHost a Fragmentos con Viewpager: Donde poner todo mi código
- Tab + ViewPager no se actualiza en su lugar muestra advertencia extraña estado esperado 3 encontrado 2
He arreglado el problema de esta manera: En la onCreate de la FragmentActivity
if(savedInstanceState!=null){ frag1 = (frag_1) getSupportFragmentManager().getFragment(savedInstanceState, frag_1.class.getName()); frag2 = (frag_2) getSupportFragmentManager().getFragment(savedInstanceState, frag_2.class.getName()); } else{ frag1 = (frag_1) Fragment.instantiate(this,frag_1.class.getName()); frag2 = (frag_2) Fragment.instantiate(this,frag_2.class.getName()); } fragments.add(frag1); fragments.add(frag2); protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); getSupportFragmentManager().putFragment(outState, frag_1.class.getName(), frag1); getSupportFragmentManager().putFragment(outState, frag_2.class.getName(), frag2); }
Tal vez no es la mejor solución en el universo, pero parece que funciona …
Cuando quiera actualizar la lista haga algo como esto:
public void setView() { Frag_2 fr = (Frag_2) vPagerAdapter.getItem(1); fragmentManager.beginTransaction().detach(fr).commit(); fragmentManager.beginTransaction().attach(fr).commit(); }
Si está utilizando un fragmento dinámico, primero debe probar para evitar la creación de una segunda instancia de un fragmento.
Para probar si el sistema está onCreate()
la actividad, compruebe si el argumento Bundle pasado a onCreate()
su actividad es null
.
Si no es null
, el sistema vuelve a crear la actividad. En este caso, la actividad vuelve a instanciar automáticamente los fragmentos existentes.
Si es null
, puedes instanciar tu fragmento dinámico con seguridad. Por ejemplo:
public void onCreate(Bundle savedInstanceState) { // ... if (savedInstanceState != null) { FragmentManager fragmentManager = getFragmentManager() // Or: FragmentManager fragmentManager = getSupportFragmentManager() FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); ExampleFragment fragment = new ExampleFragment(); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTransaction.commit(); } }
La clase Fragment
admite el onSaveInstanceState(Bundle)
(pero no el método onRestoreInstanceState()
) de la misma manera que la clase Activity.
- La implementación predeterminada guarda el estado de todas las vistas del fragmento que tienen ID.
- Puede reemplazar este método para almacenar información de estado de fragmentos adicional.
- Si el sistema vuelve a crear el fragmento de un estado guardado anterior, proporciona una referencia al
Bundle
que contiene ese estado a losonCreate()
,onCreateView()
yonActivityCreated()
; De lo contrario, el argumento se establece ennull
.
Si quieres una información detallada, aquí está una buena charla de Ken Jones de Marakana
- Editar el color de fondo de un día en la vista de calendario
- Gallery setSelection no activa el selector de imágenes