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 celui-ci
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é, j'ai besoin d'identifier quel objet est actuellement là.
En bref, je dois faire quelque chose comme ça:
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 manqué quelque chose?
J'utilise et je Compatibility Package, r3
développe pour API level 7
.
findFragmentById()
et findFragmentByTag()
fonctionnera si nous avons défini le fragment en utilisant fragmentTransaction.replace
ou fragmentTransaction.add
, mais le fera return null
si nous avons défini l'objet en xml (comme ce que j'ai fait dans my main.xml
). Je pense qu'il me manque quelque chose dans mes fichiers XML.
la source
Réponses:
Appelez
findFragmentById()
surFragmentManager
et déterminer quel fragment est dans votreR.id.frameTitle
récipient.la source
fragmentTransaction.replac
e oufragmentTransaction.add
mais ne l'obtiendra pas si nous l'avons défini sur xml. Voir ma modification 2findFragmentByTag
renvoie null en cas deActionBar
tabulations. Dans monActivity
qui s'étend,ActionBarActivity
j'ajoute d'abord des ongletsActionBar
, puis je le trouve!executePendingTransactions()
surFragmentManager
après avoir appelécommit()
à la transaction, bien que je ne l' ai pas essayé. Ou vous pouvez utilisersetContentView()
pour utiliser un fichier de mise en page avec une<fragment>
balise. L'un ou l'autre se produit de manière synchrone, et le fragment existera donc dans l'onCreate()
appel lui-même où vous avez utiliséexecutePendingTransaction()
ousetContentView()
. Sinon, un ordinaireFragmentTransaction
est traité de manière asynchrone, et il n'aura même pas commencé à laonCreate()
fin du temps .Essaye ça,
cela vous donnera le fragment actuel, alors vous pouvez le comparer à la classe de fragment et faire votre travail.
la source
getSupportFragmentManager()
place et obtiendrez null sans lasupport
pièceJe pense que vous pouvez utiliser l' événement onAttachFragment peut être utile pour détecter quel fragment est actif.
la source
Je pense que tu devrais faire:
La raison en est que vous définissez la balise "fragmentTag" sur le dernier fragment que vous avez ajouté (lorsque vous avez appelé replace).
la source
fragmentTransaction.replac
e oufragmentTransaction.add
mais ne l'obtiendra pas si nous l'avons défini sur xml. Voir ma modification 2fragmentTag
la balise correspond au fragment actuel?Vous pouvez obtenir la liste des fragments et regarder le dernier.
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é jusqu'au dernier fragment non nul et je l'ai utilisé.
la source
getFragments()
méthode. Il est marqué@hide
et n'était pas censé être inclus avec le fichier jar de la bibliothèque de support. Il ne doit pas être considéré comme faisant partie de l'API exportée.getFragments()
, car vous en avez souvent besoin. Je pense qu'il est également accessible au public maintenant.C'est la solution la plus simple et cela fonctionne pour moi.
1.) vous ajoutez votre fragment
2.)
la source
Il est peut-être tard, mais j'espère que cela aidera quelqu'un d'autre, également @CommonsWare a publié la bonne réponse.
la source
Le moyen le plus simple est peut-être:
Ça a marché pour moi
la source
Vous pouvez créer un champ dans votre classe d'activités parentale:
Et puis à l'intérieur de chaque classe de fragment:
Votre champ 'fr' est l'objet du fragment actuel
Cela fonctionne aussi avec popBackStack ()
la source
Je sais que ça fait un moment, mais je vais ici au cas où cela aiderait quelqu'un.
La bonne réponse est de loin (et celle choisie) celle de CommonsWare. J'avais le même problème que celui publié, le suivant
continué à retourner null. Mon erreur était vraiment idiote, dans mon fichier xml:
L'erreur était que j'avais android: tag au lieu d' android: id .
la source
La réponse @Hammer a fonctionné pour moi, j'utilise pour contrôler un bouton d'action flottant
la source
Si vous étendez à partir de AbstractActivity, vous pouvez utiliser la méthode getFragments ():
la source
Si vous définissez le fragment dans le format XML de l'activité,
Activity
assurez-vous d'appelersetContentView()
avant d'appelerfindFragmentById()
.la source
Si vous utilisez le BackStack ... et UNIQUEMENT si vous utilisez le back stack, essayez ceci:
la source
Cela vous donnera le nom de classe de fragment actuel ->
la source
Faites une vérification (quel fragment dans le conteneur d'activité) dans la méthode onStart;
Certains vérifient:
la source