2013-06-20 6 views
16

È possibile chiamare manualmente il metodo onCreateView in un Fragment oppure, in caso contrario, esiste un modo per simulare questo richiamo?È possibile chiamare manualmente onCreateView in un frammento?

Ho un FragmentActivity con tabHost. Ogni scheda contiene un Fragment e voglio aggiornare la vista di Fragment quando premo il pulsante "Aggiorna". Più specificamente, voglio richiamare il metodo onCreateView.

Il mio codice attualmente si presenta come:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
// Inflate the layout for this fragment 
    view= inflater.inflate(R.layout.fragment_hall, container, false); 

    layoutExsternal = (RelativeLayout) view.findViewById(R.id.layoutExsternal); 
    layoutHall = (RelativeLayout) view.findViewById(R.id.layoutHall); 

    init(); 

    return view; 
} 

    [...] 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
     // TODO Auto-generated method stub 
    Log.d("itemSelected1", this.getClass().getSimpleName()); 

    switch (item.getItemId()) { 
     case R.id.menu_refresh: 

      //HERE I want to insert a method for refresh o redraw 

    return true; 
    } 

return super.onOptionsItemSelected(item); 

} 
+0

Un approccio migliore sarebbe quello di refactoring il tuo onCreateView. Prima trova le visualizzazioni del layout e assegnale ai campi, quindi chiama un metodo delegato che li inserisce. Quindi fare in modo che l'azione di aggiornamento chiami il delegato. Sembra che tu abbia già questo con il tuo metodo init(). Non è possibile aggiornare solo chiamare questo? – k2col

+0

Trovo questo approccio utile http://stackoverflow.com/a/41888950/3496570 – Nepster

risposta

8

Ho risolto la mia domanda. Sostituisco il frammento corrente con se stesso, ma prima di aver salvato un riferimento del frammento corrente e poi chiudo il ciclo di vita del frammento corrente invocando onDestroy(). Lo ricordo con la variabile "newFragment".

  

switch (item.getItemId()) { case R.id.menu_refresh: //THIS IS THE CODE TO REFRESH THE FRAGMENT. FragmentManager manager = getActivity().getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); Fragment newFragment = this; this.onDestroy(); ft.remove(this); ft.replace(container.getId(),newFragment); //container is the ViewGroup of current fragment ft.addToBackStack(null); ft.commit(); return true; }

+5

Chiamare manualmente i metodi del ciclo di vita non è mai la soluzione giusta. Inoltre non hai bisogno della variabile 'newFragment'; potresti semplicemente usare 'this' again. – Karu

+0

Come dice @Karu, chiamare manualmente i metodi del ciclo di vita non è un buon approccio. – jwir3

3

Si può solo avere il pulsante sostituire sostituire il layout corrente con una nuova istanza del frammento.

// onButtonClick 
SomeFragment fragment = new SomeFragment(); 
getFragmentManager().beginTransaction().replace(R.id.current_layout, fragment).commit(); 
+7

Non c'è un 'commit' mancante? – TWiStErRob

26

A volte ho trovato FragmentTransaction di sostituire non avrebbe funzionato per la sostituzione di un frammento con se stesso, ciò che funziona per me sta usando smontare e rimontare:

getSupportFragmentManager() 
    .beginTransaction() 
    .detach(fragment) 
    .attach(fragment) 
    .commit(); 

Vedere this question per la differenza tra rimuovere e scollegare

+0

L'ho usato in 'onActivityResult' (tornando dalle impostazioni in cui le opzioni che influiscono sul layout potrebbero essere cambiate) dove avevo bisogno di' commitAllowingStateLoss' perché "Riceverai questa chiamata immediatamente prima di 'onResume()' quando la tua attività è in fase di riavvio. ". Chiamare 'commit' causerebbe" Impossibile eseguire questa azione dopo onSaveInstanceState ". ** Lo stato dei frammenti è ancora CONSERVATO! ** – TWiStErRob

+0

Usa invece ComedAllowingStateLoss()! – Flyview