6

Tengo un ViewPager con dos que ejemplifico en onCreate de mi FragmentActivity.Android - Viewpager y fragmentos, métodos que no funcionan

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 segunda Fragment tiene un método dentro de esa llamada que actualizar mi ListView-refreshList():

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 de 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 Corrígeme si me equivoco, pero estuve buscando por horas y no encontré una solución o una buena explicación, el FragmentActivity se crea solo una vez y el Fragments está conectado, pero el Fragments se recrea en los cambios de configuración. Ahora, cuando cambia la orientación, no obtengo el View de onCreate, así que cuando intento obtener el View del Fragment, devuelve nulo y no se llama a mi método refreshList(). ¿Cómo puedo arreglar esto?

+0

Nadie sabe cómo hacerlo? – DLock

+0

Estoy experimentando el mismo problema y no he encontrado una solución. Estoy empezando a pensar que hay un error en 'FragmentManager' u otra cosa, considerando que ambos estamos experimentando esto. – adneal

+0

¿qué hay de tu diseño xml? esto no es un problema para los fragmentos estáticos declarados en el diseño de la actividad, pero este no es el caso para los fragmentos dinámicos – chip

Respuesta

1

He arreglado el problema de esta manera: En el 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 del universo, pero parece que funciona ...

+0

Esto funciona, también ajustando 'configChanges' en los trabajos Manifest, pero no creo que estas sean soluciones sólidas. Supongo que de esta manera funcionaría en el caso de que tengas uno o dos 'Fragmentos', pero en realidad tengo cinco que están siendo afectados por esto. Me alegro de que funcione para ti. – adneal

-1

Si está utilizando un fragmento dinámico, primero debe realizar una prueba para evitar la creación de una segunda instancia de un fragmento.

Para probar si el sistema se vuelve a crear la actividad, comprobar si el argumento Bundle pasó a de onCreate() su actividad es null.

Si no es null, el sistema está volviendo a crear la actividad. En este caso, la actividad vuelve a crear instancias de los fragmentos existentes.

Si es null puede crear una instancia segura de su fragmento dinámico. 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 apoya la onSaveInstanceState(Bundle) método (pero no el método onRestoreInstanceState()) en mucho de la misma manera como la clase de actividad.

  • La implementación predeterminada guarda el estado de todas las vistas del fragmento que tienen ID.
  • Puede anular este método para almacenar información de estado de fragmento 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 métodos onCreate(), onCreateView() y onActivityCreated(); de lo contrario, el argumento se establece en null.

Si desea una información detallada, here's una buena conversación por Ken Jones, de Marakana

+0

Esta respuesta no es relevante para la pregunta. @DLock y yo no estamos usando 'FragmentTransaction', o static' Fragments' en nuestro XML. Estamos usando 'ViewPager', que requiere un' FragmentPagerAdapter'. – adneal

0

Cuando u desea actualizar la lista de hacer algo como esto:

public void setView() { 
    Frag_2 fr = (Frag_2) vPagerAdapter.getItem(1); 
    fragmentManager.beginTransaction().detach(fr).commit(); 
    fragmentManager.beginTransaction().attach(fr).commit(); 
} 
Cuestiones relacionadas