web-dev-qa-db-fra.com

GetFragmentManager.findFragmentByTag () renvoie la valeur null

        getFragmentManager().beginTransaction()
                .replace(R.id.graph_fragment_holder, new GraphFragment(), "GRAPH_FRAGMENT")
                .commit();

        getFragmentManager().beginTransaction()
                .replace(R.id.list_fragment_holder, new ListFragment(), "LIST_FRAGMENT")
                .commit();

        //getFragmentManager().executePendingTransactions();

        GraphFragment graphFragment = (GraphFragment) getFragmentManager().findFragmentByTag("GRAPH_FRAGMENT");
        graphFragment.setData(data);

        ListFragment listFragment = (ListFragment) getFragmentManager().findFragmentByTag("LIST_FRAGMENT");
        listFragment.setData(data);

J'ai fourni une balise, donc je ne sais pas pourquoi findFragmentByTag() renvoie null.

Ce que j'ai essayé de lire d'autres questions:

  1. this.setRetainInstance(true) dans la oncreate des deux fragments.

  2. Les deux constructeurs fragment sont vides public fragmentName(){}.

  3. essayé executePendingTransactions après avoir ajouté fragments.

  4. essayé add au lieu de replace sur fragments (édité)

15
John Moffitt

J'avais le même problème de findFragmentByTag() renvoyant toujours la valeur null.

Finalement, je l'ai retrouvé, je surchargeais onSaveInstanceState() dans mon activité mais je n'appelais pas super. Dès que j'ai corrigé que findFragmentByTag() a renvoyé le fragment comme prévu.

12
tagy22

J'étais confus à ce sujet depuis longtemps. Tout d’abord, vous devez sauvegarder le fragment que vous remplacez en le poussant sur la pile arrière. La balise que vous fournissez est placée sur le fragment que vous êtes en ajoutant , pas celui que vous êtes en poussant sur la pile arrière. Plus tard, quand vous le placez sur la pile arrière, cette balise va avec. Voici du code avec des objets découpés pour faciliter le traçage. Vous devez appeler 'addToBackStack' avant 'commit'.

GraphFragment grFrag = new GraphFragment();
FragmentTransaction tr = getSupportFragmentManager().beginTransaction();
tr.replace(R.id.fragment_container, grFrag, "GRAPH_FRAGMENT");
// grFrag is about to become the current fragment, with the tag "GRAPH_FRAGMENT"
tr.addToBackStack(null);
// 'addToBackStack' also takes a string, which can be null, but this is not the tag
tr.commit();
// any previous fragment has now been pushed to the back stack, with it's tag

ListFragment liFrag = new ListFragment();
FragmentTransaction tr = getSupportFragmentManager().beginTransaction();
tr.replace(R.id.fragment_container, liFrag, "LIST_FRAGMENT");
// liFrag is is about to become the current fragment, with the tag "LIST_FRAGMENT"
tr.addToBackStack(null);
tr.commit();
// 'grFrag' has now been pushed to the back stack, with it's tag being "GRAPH_FRAGMENT"
12
Rick Shory

Vous pouvez utiliser

fragmentTransaction.addToBackStack(yourFragmentTag);

Après cela, vous pouvez le réutiliser avec 

getSupportFragmentManager().findFragmentByTag(yourFragmentTag);
7
savepopulation

Appelez getFragmentManager (). ExecutePendingTransactions () après la transaction de fragment.

getFragmentManager()
    .beginTransaction()
    .replace(R.id.container, new ExampleFragment(), "YOUR TAG HERE");
    .commit();

//after transaction you must call the executePendingTransaction
getFragmentManager().executePendingTransactions();

//now you can get fragment which is added with tag
ExampleFragment exampleFragment = getFragmentManager().findFragmentByTag("YOUR TAG HERE");
5
Ali Gürelli

Répondu ici , juste besoin d'appeler getSupportFragmentManager().executePendingTransactions(); après votre findByTag ou findById

2
Dmitry Dudá

Dans mon cas, je devais créer un objet FragmentManager de niveau classe, puis l’utiliser au lieu d’utiliser directement getSupportFragmentManager ().

public class Main extends BaseActivity {
   FragmentManager fragmentManager;

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragmain);
    fragmentManager = getSupportFragmentManager();
    initFrag1();
  }

  private void initFrag1() {
    String name = Frag1.class.getSimpleName();
    if (fragmentManager.findFragmentByTag(name) == null) {
      fragmentManager.beginTransaction()
          .add(R.id.frag_container, new Frag1(), name)
          .addToBackStack(name)
          .commit();
    }
  }
}
0
Prabin Timsina