6

Ho un ViewPager con due Fragments che istanzio nel onCreate del mio FragmentActivity.Android - Viewpager e frammenti, metodi non funzionanti

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); 

Il mio secondo Fragment ha un metodo all'interno di quella telefonata che ho di aggiornare il mio 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);} 
    } 
} 

Chiamato dal mio FragmentActivity

//Something 
Frag_2 fr = (Frag_2) vPagerAdapter.getItem(1); 
if (fr.getView() != null) { 
    fr.refreshList(data); 
} 

Funziona bene fino a cambiare l'orientamento dello schermo. Correggetemi se sbaglio, ma ero alla ricerca di ore e non ho trovato una soluzione o una buona spiegazione, il FragmentActivity viene creata una sola volta e la Fragments sono attaccati ad esso, ma la Fragments ricreano sulle modifiche di configurazione. Ora, quando l'orientamento cambia non ottengo il View da onCreate così quando provo a ottenere il View dal Fragment restituisce null e il mio metodo refreshList() non viene chiamato. Come posso risolvere questo?

+0

Nessuno sa come si fa? – DLock

+0

Sto riscontrando lo stesso problema e non ho trovato una soluzione. Sto iniziando a pensare che ci sia un bug in "FragmentManager" o qualcos'altro considerando che stiamo entrambi sperimentando questo. – adneal

+0

e il tuo layout xml? questo non è un problema per i frammenti statici dichiarati nel layout dell'attività, ma questo non è il caso per i frammenti dinamici – chip

risposta

1

ho risolto il problema in questo modo: Nel onCreate del 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); 
    } 

forse non è la migliore soluzione dell'universo, ma sembra che funzioni ...

+0

Funziona, anche regolando i 'configChanges' nel Manifest funziona, ma non penso che siano soluzioni solide. Suppongo che in questo modo funzionerebbe nel caso in cui tu abbia uno o due 'frammenti', ma in realtà ne ho cinque che vengono effettuati da questo. Sono contento che funzioni per te però. – adneal

-1

Se si utilizza un frammento dinamica, è necessario testare prima per evitare la creazione di una seconda istanza di un frammento.

Per verificare se il sistema sta ricreando l'attività, verificare se l'argomento passato alla Bundle di onCreate() la vostra attività è null.

Se è non null, il sistema è ricreare l'attività. In questo caso, l'attività rianalizza automaticamente i frammenti esistenti .

Se è null è possibile creare un'istanza in modo sicuro il frammento dinamica. Per esempio:

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 classe Fragment supporta il metodo onSaveInstanceState(Bundle) (ma non il metodo onRestoreInstanceState()) più o meno allo stesso modo in cui la classe di attività.

  • L'implementazione di default salva lo stato di tutte le viste del frammento che hanno ID.
  • È possibile ignorare questo metodo per memorizzare informazioni aggiuntive Stato frammento.
  • Se il sistema sta ricreando il frammento da uno stato salvato precedente, fornisce un riferimento allo Bundle contenente tale stato ai metodi onCreate(), onCreateView() e onActivityCreated(); in caso contrario, l'argomento è impostato su null.

Se si desidera un informazioni dettagliate, here's una bella chiacchierata da Ken Jones di Marakana

+0

Questa risposta non è pertinente alla domanda. @DLock e I non stanno usando 'FragmentTransaction', o' Fragments' statici nel nostro XML. Stiamo usando 'ViewPager', che richiede un' FragmentPagerAdapter'. – adneal

0

Quando u desidera aggiornare l'elenco fare qualcosa di simile:

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