web-dev-qa-db-fra.com

Est-il possible d'appeler manuellement onCreateView dans un fragment?

Est-il possible d'appeler manuellement la méthode onCreateView dans un Fragment ou, sinon, est-il possible de simuler cette invocation?

J'ai un FragmentActivity avec tabHost. Chaque onglet contient un Fragment et je souhaite rafraîchir la vue de Fragment lorsque j'appuie sur le bouton "Actualiser". Plus précisément, je souhaite rappeler la méthode onCreateView.

Mon code ressemble actuellement à:

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

}
21
Symon_9851

J'ai résolu ma question. Je remplace le fragment actuel par lui-même, mais avant d'avoir enregistré une référence du fragment actuel, puis je ferme le cycle de vie du fragment actuel en invoquant onDestroy (). Je m'en souviens avec la variable "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;
    }
8
Symon_9851

Parfois, j'ai trouvé que le remplacement de FragmentTransaction ne fonctionnerait pas pour remplacer un fragment par lui-même, ce qui fonctionne pour moi est d'utiliser détacher et attacher:

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

Voir cette question pour la différence entre supprimer et détacher

32
Matthew Mcveigh

Vous pouvez simplement demander à votre bouton de remplacement de remplacer la disposition actuelle par une nouvelle instance du fragment.

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