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.
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
.
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");
}
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();
}
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).
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
}
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;
}
}
}
}
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");
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
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 ()
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.
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);
}
}
});
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;
}
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()
.
Si vous étendez à partir de AbstractActivity, vous pouvez utiliser la méthode getFragments ():
for (Fragment f : getFragments()) {
if (f instanceof YourClass) {
// do stuff here
}
}