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.
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
.
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");
}
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();
}
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).
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
}
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");
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;
}
}
}
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
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.
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 ()
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;
}
@ 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);
}
}
});
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()
.