Je fais ma classe d'assistance de changeur de fragment et j'ai un problème avec elle.
Je l'appelle il a un J'ai fait mon propre fonction qui est: p> L'erreur est la suivante: p> Si j'utilise ma fonction Remplacer par l'enregistrement sur Backstack, il fonctionne correctement, je peux utiliser le bouton arrière de mon périphérique pour vous reculer et revenir à des ajouts prévisibles. Fragments, il fonctionne comme un charme. P> mais quand je voudrais remplacer un fragment Donc, je peux voir 2 fragments à la fois même, comme celui-ci: p> Ceci est mon code: P> fragmentChanger code> p>
fragmentcontainer code> , qui est un
groupe de visit code>, qui contient tous les fragments que je voudrais montrer. p>
remplacer (fragment fragmenttchange, Boolean NetherAveTobackstackStack) Code > p>
NeedAvetObackStack code> est
true code> ou
false code>. Li>.
ul>
p>
public class MainActivity extends Activity implements OnClickListener {
// My 3 Fragment Classes, could be N other type,
// in this example I only got 3
FragmentA fragmentA;
FragmentB fragmentB;
FragmentC fragmentC;
// Button to add the fragments manually
Button addA, addB, addC;
// This is my activity's container, its a simple viewGroup
// could be anything that can hold fragments
ViewGroup fragmentContainer;
// This is my fragment changer helper class that need some revision by you
// guys
FragmentChanger fragmentChanger;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//defining my adding buttons
addA = (Button)findViewById(R.id.addAbtn);
addB = (Button)findViewById(R.id.addBbtn);
addC = (Button)findViewById(R.id.addCbtn);
//setting onclicklistenrs
addA.setOnClickListener(this);
addB.setOnClickListener(this);
addC.setOnClickListener(this);
// defining my main container, this will holds fragments
fragmentContainer = (ViewGroup) findViewById(R.id.fragmentContainer);
// defining my fragments, each of them got an Activity (this), a
// Container (mainContainer), and a Layout ofc.
fragmentA = new FragmentA(this, fragmentContainer, R.layout.fragment_a_layout);
fragmentB = new FragmentB(this, fragmentContainer, R.layout.fragment_b_layout);
fragmentC = new FragmentC(this, fragmentContainer, R.layout.fragment_c_layout);
// defining my fragment changer with an activity(this), a
// container(mainContent) and a starting fragment to show!
fragmentChanger = new FragmentChanger(this, fragmentContainer, fragmentA);
}
@Override
public void onClick(View view) {
if (view.equals(addA)) {
//When adding fragmentA, i always want to save it to backstack
fragmentChanger.replace(fragmentA, true);
} else if (view.equals(addB)) {
//I dont want to save to back stack when adding B
//So if i press back button, i dont want to see fragmentB ever again.
//(But i do see, this is the error.)
fragmentChanger.replace(fragmentB, false);
} else if (view.equals(addC)) {
//When adding fragmentC, i always want to save it to backstack
fragmentChanger.replace(fragmentC, true);
}
//After any modification on fragments, i log the backstack
fragmentChanger.logBackStack();
}
4 Réponses :
Essayez de remplacer le fragment à l'aide de fragmentsTransacion.replace méthode comme indiqué dans Link ici p>
Et vous pouvez faire référence à Cet exemple aussi. Cela fonctionne parfaitement pour moi. P>
Comme vous pouvez le voir, j'utilise juste comme ça: fragmenttransaction.replace (fragmentContainer.getid (), fragmenttchange, fragmenttochange.getclass (). GetImplename ());
Alors ici ce que j'ai trouvé mal avec votre code:
1) Vous mélangez ensemble des étiquettes de Alors, vous obtenez la balise de 2) Il n'est généralement pas une bonne idée de stocker et de réutiliser des fragments comme vous le faites dans vos champs de classe: fragment code> et
backstackentry code>. p>
Backstackentry code> (non
fragment code>), que vous ajoutez ou non dans
fragmenttransaction.addttobackstackstack () < / code>. Par conséquent, vous obtenez le mauvais état et l'utiliser comme fragment de courant. P>
fragmenta fragmenta; code>. Cela peut entraîner des problèmes d'état et d'inflation, il est préférable de les créer sur chaque transaction, si vous ne voulez pas résoudre des énigmes supplémentaires. P> P>
Honnêtement, je ne sais pas que c'est vraiment la solution, mais cette réponse est la meilleure et la prime se termine en 1 jour, donc je ne veux donc pas la réputation "perdue" alors c'est ici.
Tout d'abord dans le constructeur de votre Il y a beaucoup de remplaçants dans votre code, donc je ne sais pas comment réparer cela, mais je peux donner un aperçu général de ce que vous devriez faire. P>
Si vous souhaitez ajouter un fragment à l'arrière-plan, faites un Si vous ne voulez pas ajouter un fragment particulier, ignorez simplement le Aussi votre lire ce Répondre ici pour une meilleure explication et aussi ce Réponse P> fragmentChanger code>, vous ajoutez tous les fragments sur votre dostack. Depuis que vous les ajoutez dans l'ordre d'être ajouté en tant que, B, B, puis C.
Après les avoir ajoutés à l'arrière-plan dans cet ordre, vous faites plus de transactions sur le dessus. Tout en les initialisant, évitez d'y ajouter à la marche arrière. Ajoutez uniquement / supprimez-les tandis que le bouton réelle cliquez sur. p>
.replace (paramètres) .Addtobackstackstack (tag) code> p>
addtobackstackstack (tag) code> ligne complètement. p>
getCurrentfragment () code> peut être modifié en p>
fragment CurrentFrag = getfragmentManager (). FINDFRAGMENTBYID (R.ID.FRAGMENT_CONTINAINER); CODE> P>
"Premièrement, dans le constructeur de votre classe de fragmentsChanger, vous ajoutez tous les fragments sur votre dosseret." Bien non, je ne fais pas.
Changer cette ligne à p>
Avez-vous seulement cliqué sur le bouton addb dans votre exemple? Votre activité a commencé et vous avez cliqué uniquement sur "Ajouter B"?
Non, je les poussez à tous dans un ordre aléatoire.