web-dev-qa-db-fra.com

Remplacement d'un fragment par un autre fragment au sein du groupe d'activités

J'ai un fragment dans une activité de groupe et je souhaite le remplacer par un autre fragment:

FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
SectionDescriptionFragment bdf = new SectionDescriptionFragment();
ft.replace(R.id.book_description_fragment, bdf);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();

Cela fonctionne bien quand il est fait en tant que projet séparé sans utiliser le groupe d'activité, tout fonctionne bien dans log cat car le contrôle va dans getview (), mais aucune vue n'est visible, aucune exception ne se produit, je veux que le fragment de détail du livre être remplacé par fragment de détail de section.

XML du fragment de détail de livre a pour identifiant book_description_fragment et xml pour le fragment de description de section a pour identifiant section_description_fragment.

Le code ci-dessus est dans la méthode onClick d'un élément. Je souhaite que lorsque l'utilisateur appuie sur un élément en mode de défilement horizontal, le fragment change.

124
Lion Heart

Les fragments codés en dur en XML ne peuvent pas être remplacés. Si vous devez remplacer un fragment par un autre, vous devez d'abord les ajouter de manière dynamique. 

Remarque: R.id.fragment_container est une présentation ou un conteneur de votre choix dans l'activité à laquelle vous apportez le fragment.

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack if needed
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();
236
Subin Sebastian

S'il vous plaît voir cette Question

Vous pouvez uniquement remplacer un "fragment ajouté dynamiquement".

Donc, si vous voulez ajouter un fragment dynamique, voyez this example.

31
Sana

J'ai fait un Gist avec LA méthode parfaite pour gérer fragment _ {remplacement et cycle de vie

Il ne fait que remplacer le fragment actuel par un nouveau, si ce n'est pas le même et s'il n'est pas en backstack (dans ce cas, il apparaîtra). 

Il contient plusieurs options comme si vous vouliez que le fragment soit sauvegardé dans un backstack. 

=> Voir Gist ici

En utilisant cette activité et une seule activité, vous pouvez ajouter ceci à votre activité:

@Override
public void onBackPressed() {
    int fragments = getSupportFragmentManager().getBackStackEntryCount();
    if (fragments == 1) {
            finish();
            return;
    }

    super.onBackPressed();
}
8
Hugo Gresse

Utilisez le code ci-dessous dans Android.support.v4

FragmentTransaction ft1 = getFragmentManager().beginTransaction();
WebViewFragment w1 = new WebViewFragment();
w1.init(linkData.getLink());
ft1.addToBackStack(linkData.getName());
ft1.replace(R.id.listFragment, w1);
ft1.commit();
7
Sachin Suthar

Utilisez ce code en utilisant v4 

 ExampleFragment newFragment = new ExampleFragment();     
 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();  
 // Replace whatever is in the fragment_container view with this fragment,  
 // and add the transaction to the back stack so the user can navigate back   
 transaction.replace(R.id.container, newFragment);
 transaction.addToBackStack(null);  
 // Commit the transaction   
 transaction.commit();
4
Manish Butola

j'espère que vous allez bien.Quand j'ai commencé à travailler avec Android Fragments, alors j'avais également le même problème, alors j'ai lu quelque chose à propos de 1- Comment changer de fragment avec d'autres . 2- Comment ajouter fragment Fragment container n'a pas de fragment.

puis après quelques travaux de R & D, j'ai créé une fonction qui m'aide dans de nombreux projets jusqu'à présent et j'utilise encore cette fonction simple.

public void switchFragment(BaseFragment baseFragment) {
    try {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setCustomAnimations(Android.R.anim.slide_in_left, Android.R.anim.slide_out_right);
        if (getSupportFragmentManager().findFragmentById(R.id.home_frame) == null) {
            ft.add(R.id.home_frame, baseFragment);
        } else {
            ft.replace(R.id.home_frame, baseFragment);
        }
        ft.addToBackStack(null);
        ft.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

profitez de votre temps de code :)

3
John smith

Utilisez ViewPager. C'est un travail pour moi.

final ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.vp_pager); 
button = (Button)result.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        viewPager.setCurrentItem(1);
    }
});
3
Nikolay

En kotlin, vous pouvez faire:

// instantiate the new fragment
val fragment: Fragment = ExampleFragment()

val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.book_description_fragment, fragment)
transaction.addToBackStack("transaction_name")
// Commit the transaction
transaction.commit()
0
Nicola Gallazzi

vous pouvez utiliser un code simple son travail pour la transaction

Fragment newFragment = new MainCategoryFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame_NavButtom, newFragment);
ft.commit(); 
0
user8427383

Vous pouvez utiliser ce code

((AppCompatActivity) getActivity()).getSupportFragmentManager().replace(R.id.YourFrameLayout, new YourFragment()).commit();
0
Diako Hasani