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:
this.setRetainInstance(true)
dans la oncreate
des deux fragments
.
Les deux constructeurs fragment
sont vides public fragmentName(){}
.
essayé executePendingTransactions
après avoir ajouté fragments
.
essayé add
au lieu de replace
sur fragments
(édité)
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.
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"
Vous pouvez utiliser
fragmentTransaction.addToBackStack(yourFragmentTag);
Après cela, vous pouvez le réutiliser avec
getSupportFragmentManager().findFragmentByTag(yourFragmentTag);
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");
Répondu ici , juste besoin d'appeler getSupportFragmentManager().executePendingTransactions();
après votre findByTag ou findById
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();
}
}
}