536 votes

obtenir le fragment actuellement affiché

Je joue avec Fragment dans Android.

Je sais que je peux changer de fragment en utilisant le code suivant :

FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction fragTrans = fragMgr.beginTransaction();

MyFragment myFragment = new MyFragment();//my custom fragment

fragTrans.replace(android.R.id.content, myFragment);
fragTrans.addToBackStack(null);
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragTrans.commit();

Ma question est la suivante : dans un fichier Java, comment puis-je obtenir l'instance de fragment actuellement affichée ?

510voto

ramdroid Points 1688

Lorsque vous ajoutez le fragment dans votre transaction, vous devez utiliser une balise...

fragTrans.replace(android.R.id.content, myFragment, "MY_FRAGMENT");

...et plus tard si vous voulez vérifier si le fragment est visible :

MyFragment myFragment = (MyFragment)getFragmentManager().findFragmentByTag("MY_FRAGMENT");
if (myFragment.isVisible()) {
   // add your code here
}

Voir aussi http://developer.Android.com/reference/Android/app/Fragment.html

453voto

Sev Points 219

Je sais que c'est un vieux post, mais j'avais aussi des problèmes avec ça avant. J'ai trouvé une solution qui consistait à faire ceci dans la fonction d'écoute OnBackStackChanged()

Fragment f = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
if (f instanceof CustomFragmentClass) 
    // do something with f
    f.doSomething();

cela a fonctionné pour moi car je ne voulais pas itérer à travers chaque fragment que j'ai pour en trouver un qui soit visible. j'espère que cela aidera quelqu'un d'autre aussi.

184voto

Matt Mombrea Points 3297

Voici ma solution, que je trouve pratique pour les scénarios à faible fragmentation.

public Fragment getVisibleFragment(){
    FragmentManager fragmentManager = MainActivity.this.getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();
    for(Fragment fragment : fragments){
        if(fragment != null && fragment.isVisible())
            return fragment;
    }
    return null;
}

83voto

Dmitry_L Points 401

Chaque fois que vous montrez un fragment, vous devez mettre le tag dans le backstack :

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_ENTER_MASK);       
ft.add(R.id.primaryLayout, fragment, tag);
ft.addToBackStack(tag);
ft.commit();        

Et ensuite, lorsque vous avez besoin d'obtenir le fragment actuel, vous pouvez utiliser cette méthode :

public BaseFragment getActiveFragment() {
    if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
        return null;
    }
    String tag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
    return (BaseFragment) getSupportFragmentManager().findFragmentByTag(tag);
}

23voto

tainy Points 83

Ce que j'utilise pour trouver le fragment d'affichage actuel est dans le code ci-dessous. C'est simple et cela fonctionne pour moi maintenant. Il s'exécute dans l'activité qui contient les fragments.

    FragmentManager fragManager = this.getSupportFragmentManager();
    int count = this.getSupportFragmentManager().getBackStackEntryCount();
    Fragment frag = fragManager.getFragments().get(count>0?count-1:count);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X