web-dev-qa-db-fra.com

Obtenir l'objet fragment actuel

Dans mon main.xml j'ai

  <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 un objet fragment comme ça

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 Fragment (FragmentType2,FragmentType3,...) à des moments différents. Maintenant, à un moment donné, je dois identifier quel objet est actuellement là.

Dans court je dois faire quelque chose comme ceci:

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

J'ai essayé le suivant

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 oublié quelque chose?
J'utilise Compatibility Package, r3 et je développe pour API level 7.

findFragmentById() et findFragmentByTag() fonctionneront si nous avons défini fragment en utilisant fragmentTransaction.replace ou fragmentTransaction.add, mais nous allons return null si nous avons défini l'objet au xml (comme ce que je ont fait dans mon main.xml). Je pense que quelque chose manque dans mes fichiers XML.

167
Labeeb Panampullan

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.

248
CommonsWare

Essaye ça,

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

ceci vous donnera le fragment actuel, vous pourrez alors le comparer à la classe fragment et faire votre travail.

    if (currentFragment instanceof NameOfYourFragmentClass) {
     Log.v(TAG, "find the current fragment");
  }
103
Hammer

Je pense que vous pouvez utiliser l'événement onAttachFragment peut être utile pour identifier le fragment 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();

}
37
Hede Hodo

Je pense que tu devrais 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é le remplacement).

12
Niqo

Ceci 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

}
10
Gau

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 revenez 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é le dernier fragment non nul et je l'ai utilisé.

    FragmentManager fm = getSupportFragmentManager();
    if (fm != null) {
        List<Fragment> fragments = fm.getFragments();
        if (fragments != null) {
            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;
                }
            }
        }
    }
10
eluleci

Il est peut-être tard, mais j'espère que cela aidera quelqu'un d'autre. @CommonsWare a également 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");
9
Ahmad Ali Nasir

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 fonctionné pour moi

6
madx

Vous pouvez créer un champ dans votre classe d'activité parent:

public class MainActivity extends AppCompatActivity {

    public Fragment fr;

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

}

Et ensuite à l'intérieur de chaque classe de fragments:

public class SomeFragment extends Fragment {

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

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

Votre champ 'fr' est fragment fragment courant Object

Cela fonctionne aussi avec popBackStack ()

5
buxik

Je sais que ça fait longtemps, mais je vais le dire ici au cas où cela aiderait quelqu'un.

Le bonne réponse est de loin (et celui sélectionné) celui de CommonsWare. J'avais le même problème que posté, le suivant

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

continué à retourner 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 j'avais Android: tag AU LIEU DE Android: id.

4
Chayemor

La réponse de @Hammer a fonctionné pour moi, je suis en train d'utiliser 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
Thiago Melo

Si vous utilisez la pile de stockage ... et UNIQUEMENT si vous utilisez la pile de pile, 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;
}
1
James Barwick

Si vous définissez le fragment dans la présentation XML de l'activité, dans la section Activity, assurez-vous d'appeler setContentView() avant d'appeler findFragmentById().

1
IvancityM

Si vous étendez à partir de AbstractActivity, vous pouvez utiliser la méthode getFragments ():

for (Fragment f : getFragments()) {
    if (f instanceof YourClass) {
        // do stuff here
    }
}