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 ListViewrefreshList() :

 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?

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 los onCreate() , onCreateView() y onActivityCreated() ; De lo contrario, el argumento se establece en null .

Si quieres una información detallada, aquí está una buena charla de Ken Jones de Marakana

  • Insertar y quitar fragmentos en viewpager correctamente
  • Android Poner la animación en la página de desplazamiento en la vista paginador utilizando fragmento
  • TextView dentro de ViewPager intercepta eventos de toque
  • Adaptador sin fin para ViewPager
  • ¿Por qué ViewPager genera errores en el modo de diseño de Android Studio?
  • ¿Cómo puedo establecer TextColor, TextSize de PagerTitleStrip de código?
  • ViewPager da fuera del error de memoria
  • Preload de la vista del fragmento en ViewPager en la primera ejecución
  • Nullpointerexception en dispatchDraw con ViewPager en fragmento anidado con PageTransformer
  • Detectar el cambio de vista en ViewPager
  • ¿Dónde está un código de ejemplo / tutorial de Viewpager que funciona bien para todos?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.