web-dev-qa-db-fra.com

Remplacer un fragment par programme

J'ai trois fragments comme indiqué dans la figure ci-dessous. J'ai ajouté tous ces trois fragments dans linearlayout à l'aide du fichier .xml et lorsque mon activité de lanceur commence, je charge cette mise en page .xml à l'aide de SetContentView.

[.____] J'ai des contrôles sur Fragment2. En cliquant sur n'importe quel chargement, le fragment4 utilise par programme par programmation par fragmentTransaction et une méthode de validation. Ces fragments sont ajoutés à l'écran, mais le problème est le fragment de la prématurabation ajoutée4 Prenez la zone de l'écran entière. Quel peut être le problème?

[.____] Remarque: sur n'importe quel élément, cliquez sur F2, je veux remplacer uniquement F2 avec un nouveau fragment F4. N'oubliez pas que j'ai ajouté F1, F2, F3 via un fichier de mise en page XML et ajout de nouveau fragment F4 Programmatiquement.

enter image description here

20
VishalSoni

Vous devez toujours ajouter, supprimer et remplacer vos fragments de manière programmable. En tant que tel, je vous suggère de remplacer vos fragments F-1, F-2 et F-3 avec des conteneurs tels que FRAMELAYOUT.

Fondamentalement au lieu d'avoir un <fragment/> élément comme F-1, vous en faites un <FrameLayout/> élément. Ensuite, vous effectuez une transaction de fragment dans votre fragmentactivité de l'oncree:

Fragment1 f1 = new Fragment1();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.f1_container, f1); // f1_container is your FrameLayout container
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();  

Supposons maintenant que vous l'avez fait pour F-1, F-2 et F-3. Vous remplacez ensuite F2 avec F4 en faisant la même chose dans votre OnClickListener:

public void onClick(View v) {
    Fragment4 f4 = new Fragment4();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.f2_container, f4); // f2_container is your FrameLayout container
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.addToBackStack(null);
    ft.commit();   
}
34
CodePrimate

Ne gardez que Framelayout en tant qu'esponsultiers pour le fragment dans le XML. Dans l'Oncreate, chargez les fragments de la Framelayout. OnCliquez sur le fragment, donnez cet ID de Framelayout en particulier à remplacer par fragment4.

2
user936414