È possibile chiamare manualmente onCreateView in un Frammento?

È possibile chiamare manualmente il metodo onCreateView in un Fragment o, se non, c’è qualche modo è possibile simulare questa invocazione?

Ho un FragmentActivity con tabHost. Ogni scheda contiene un Fragment e voglio aggiornare il Fragment‘s vedi quando premo il pulsante “Aggiorna”. Più in particolare, voglio ri-chiamare il onCreateView metodo.

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

}
  • Un approccio migliore sarebbe quello di effettuare il refactoring del onCreateView. Prima di trovare il tuo layout di vista e assegnare loro campi, quindi chiamare un metodo di delegato che le popola. Quindi l’azione di aggiornamento chiamare il delegato. Ti sembra di avere già questo con il metodo init (). Non è possibile aggiornare solo chiamata?
  • Trovo che questo approccio utile stackoverflow.com/a/41888950/3496570
InformationsquelleAutor Symon_9851 | 2013-06-20

 

3 Replies
  1. 32

    A volte ho trovato FragmentTransaction la sostituzione non opera per la sostituzione di un frammento di sé, ciò che funziona per me è scollegamento e collegamento:

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

    Vedere questa domanda per la differenza tra rimuovere e scollegare

    • Ho usato in onActivityResult (di ritorno da impostazioni dove layout opzioni relative potrebbero essere cambiate) in cui avevo bisogno di commitAllowingStateLoss perché “riceverete la chiamata immediatamente prima onResume() quando la vostra attività è ri-partenza.”. Chiamata commit provocherebbe “non Può eseguire questa azione dopo onSaveInstanceState”. Frammento di stato, CONSERVATA ancora!
    • Utilizzare .commitAllowingStateLoss (), invece!
  2. 8

    Ho risolto la mia domanda. Posso sostituire l’attuale frammento in sé stessa, ma prima ho salvato un riferimento di corrente frammento e quindi posso chiudere il ciclo di vita di corrente frammento invocando onDestroy(). Ricordo con “newFragment” variabile.

     

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

    • Manualmente la chiamata di metodi del ciclo di vita non è mai la soluzione giusta. Inoltre, non avete bisogno di un newFragment variabile; si potrebbe utilizzare this di nuovo.
    • Come @Karu dice, richiamo manuale metodi del ciclo di vita non è un buon approccio.
  3. 3

    Si può avere solo il pulsante sostituisci sostituire l’attuale layout con una nuova istanza del frammento.

    //onButtonClick
    SomeFragment fragment = new SomeFragment();
    getFragmentManager().beginTransaction().replace(R.id.current_layout, fragment).commit();
    • Non c’è un commit mancanti?

Lascia un commento