Récupère l'objet fragment actuel

Mon main.xml {j'ai[17]}

  <FrameLayout
        android:id="@+id/frameTitle"
        android:padding="5dp"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:background="@drawable/title_bg">
            <fragment
              android:name="com.fragment.TitleFragment"
              android:id="@+id/fragmentTag"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content" />

  </FrameLayout>

Et je mets l'objet fragment comme ceci

FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new FragmentType1();
fragmentTransaction.replace(R.id.frameTitle, casinodetailFragment, "fragmentTag");

// fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

Il définit différents types D'objets de Fragment (FragmentType2,FragmentType3,...) à un moment différent. Maintenant, à un moment donné, j'ai besoin d'identifier quel objet est actuellement là.

Dans courte j'ai besoin de faire quelque chose comme ceci:

Fragment currentFragment = //what is the way to get current fragment object in FrameLayout R.id.frameTitle

J'ai essayé ce qui suit

TitleFragment titleFragmentById = (TitleFragment) fragmentManager.findFragmentById(R.id.frameTitle);

Et

    TitleFragment titleFragmentByTag = (TitleFragment) fragmentManager.findFragmentByTag("fragmentTag");

Mais les deux objets (titleFragmentById et titleFragmentByTag ) sont null
Ai-je raté quelque chose?
J'utilise Compatibility Package, r3 et je développe pour API level 7.

findFragmentById() et findFragmentByTag() fonctionnera si nous avons mis fragment à l'aide de fragmentTransaction.replace ou fragmentTransaction.add, mais return null si nous avons mis l'objet en xml (comme ce que j'ai fait dans ma main.xml). Je pense qu'il me manque quelque chose dans Mes fichiers XML.

155
demandé sur Léo Lam 2011-07-19 19:47:16

13 réponses

Maintenant, à un moment donné, j'ai besoin d'identifier quel objet est actuellement là

Appelez findFragmentById() sur FragmentManager et déterminez quel fragment se trouve dans votre conteneur R.id.frameTitle.

237
répondu CommonsWare 2011-07-19 17:39:29

Essayez ceci,

Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);

Cela vous donnera le fragment actuel, alors vous pouvez le comparer à la classe fragment et faire vos trucs.

    if (currentFragment instanceof NameOfYourFragmentClass) {
     Log.v(TAG, "find the current fragment");
  }
87
répondu Hammer 2018-07-15 15:28:35

Je pense que vous pouvez utiliser onattachfragment événement peut être utile pour attraper quel fragment est actif.

@Override
public void onAttachFragment(Fragment fragment) {
    // TODO Auto-generated method stub
    super.onAttachFragment(fragment);

    Toast.makeText(getApplicationContext(), String.valueOf(fragment.getId()), Toast.LENGTH_SHORT).show();

}
35
répondu Hede Hodo 2013-02-24 03:24:44

Je pense que vous devriez faire:

Fragment currentFragment = fragmentManager.findFragmentByTag("fragmentTag");

La raison en est que vous définissez la balise "fragmentTag" sur le dernier fragment que vous avez ajouté (lorsque vous avez appelé replace).

11
répondu Niqo 2011-07-25 05:14:31

C'est la solution la plus simple et fonctionne pour moi.

1.) vous ajoutez votre fragment

ft.replace(R.id.container_layout, fragment_name, "fragment_tag").commit();

2.)

FragmentManager fragmentManager = getSupportFragmentManager();

Fragment currentFragment = fragmentManager.findFragmentById(R.id.container_layout);

if(currentFragment.getTag().equals("fragment_tag"))

{

 //Do something

}

else

{

//Do something

}
9
répondu Gau 2016-07-07 08:44:30

Il pourrait être en retard mais j'espère que cela aidera quelqu'un d'autre, aussi @CommonsWare a posté la bonne réponse.

FragmentManager fm = getSupportFragmentManager();
Fragment fragment_byID = fm.findFragmentById(R.id.fragment_id);
//OR
Fragment fragment_byTag = fm.findFragmentByTag("fragment_tag");
8
répondu Ahmad Ali Nasir 2013-02-19 17:44:59

Vous pouvez obtenir la liste des fragments et regarder le dernier.

    FragmentManager fm = getSupportFragmentManager();
    List<Fragment> fragments = fm.getFragments();
    Fragment lastFragment = fragments.get(fragments.size() - 1);

Mais parfois (lorsque vous naviguez en arrière) la taille de la liste reste la même mais certains des derniers éléments sont nuls. Donc, dans la liste, j'ai itéré au dernier fragment not null et l'ai utilisé.

    FragmentManager fm = getSupportFragmentManager();
    if (fm != null) {
        List<Fragment> fragments = fm.getFragments();
        for(int i = fragments.size() - 1; i >= 0; i--){
            Fragment fragment = fragments.get(i);
            if(fragment != null) {
                // found the current fragment

                // if you want to check for specific fragment class
                if(fragment instanceof YourFragmentClass) {
                    // do something
                }
                break;
            }
        }
    }
8
répondu eluleci 2014-03-04 09:02:35

Peut-être que le moyen le plus simple est:

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

Ça a marché pour moi

6
répondu madx 2014-06-07 18:00:42

Je sais que ça fait un moment, mais je le ferai ici au cas où ça aiderait quelqu'un.

La bonne réponse est de loin (et celle sélectionnée) celle de CommonsWare. J'avais le même problème que Posté, le suivant

MyFragmentClass fragmentList = 
            (MyFragmentClass) getSupportFragmentManager().findFragmentById(R.id.fragementID);

Gardé en retournant null. Mon erreur était vraiment stupide, dans mon fichier xml:

<fragment
    android:tag="@+id/fragementID"
    android:name="com.sf.lidgit_android.content.MyFragmentClass"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>

L'erreur était que je devais android:tag au LIEU DE android:id.

4
répondu Chayemor 2014-03-11 21:04:19

Vous pouvez créer un champ dans votre classe D'activité parente:

public class MainActivity extends AppCompatActivity {

    public Fragment fr;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

}

Puis à l'intérieur de chaque classe de fragment:

public class SomeFragment extends Fragment {

@Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        ((MainActivity) getActivity()).fr = this;
}

Votre champ ' fr ' est l'objet fragment courant

Cela fonctionne aussi avec popBackStack ()

3
répondu buxik 2015-07-08 11:26:16

Si vous utilisez le BackStack...et seulement si vous utilisez la pile arrière, essayez ceci:

rivate Fragment returnToPreviousFragment() {

    FragmentManager fm = getSupportFragmentManager();

    Fragment topFrag = null;

    int idx = fm.getBackStackEntryCount();
    if (idx > 1) {
        BackStackEntry entry = fm.getBackStackEntryAt(idx - 2);
        topFrag = fm.findFragmentByTag(entry.getName());
    }

    fm.popBackStack();

    return topFrag;
}
2
répondu James Barwick 2014-11-10 04:45:08

@ Hammer response a fonctionné pour moi, im utilisant pour contrôler un bouton d'action flottant

final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View view) {
            android.app.Fragment currentFragment = getFragmentManager().findFragmentById(R.id.content_frame);
            Log.d("VIE",String.valueOf(currentFragment));
            if (currentFragment instanceof PerfilFragment) {
                PerfilEdit(view, fab);
            }
        }
});
2
répondu Thiago Melo 2017-02-02 19:06:31

Si vous définissez le fragment dans LAYOUR XML de L'activité, alors dans le Activity Assurez-vous d'appeler setContentView() avant d'appeler findFragmentById().

0
répondu IvancityM 2012-11-14 13:55:00