Comment puis-je accéder à getSupportFragmentManager () dans un fragment?


157

J'ai un FragmentActivity et je souhaite utiliser un fragment de carte en son sein. J'ai un problème pour que le gestionnaire de fragments de support y accède.

 if (googleMap == null) {
            googleMap = ((SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map1)).getMap();

            // check if map is created successfully or not
            if (googleMap == null) {
                Toast.makeText(getApplicationContext(),
                        "Sorry! unable to create maps", Toast.LENGTH_SHORT)
                        .show();
            }
        }

            // create marker
            MarkerOptions marker = new MarkerOptions().position(
                    new LatLng(latitude, longitude)).title("Hello Maps ");

            CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target(new LatLng(latitude, longitude)).zoom(15).build();

            googleMap.animateCamera(CameraUpdateFactory
                    .newCameraPosition(cameraPosition));

            // adding marker
            googleMap.addMarker(marker);

Réponses:


278

Vous pouvez appeler directement

getFragmentManager() 

pour obtenir le gestionnaire de fragments.

ou

Dans ton fragment,

Créer un champ:

private FragmentActivity myContext;

remplacez la méthode onAttach de votre fragment:

@Override
public void onAttach(Activity activity) {
    myContext=(FragmentActivity) activity;
    super.onAttach(activity);
}

Lorsque vous avez besoin d'un appel au gestionnaire de fragments de support:

FragmentManager fragManager = myContext.getSupportFragmentManager(); //If using fragments from support v4

ou

FragmentManager fragManager = myContext.getFragmentManager();

Vous avez terminé.


3
quand je clique pour la première fois, cela fonctionne, mais après cela, je clique à nouveau sur un autre fragment, cela montre une page blanche ..
DjP

11
C'est une surcharge. Voir ma réponse ci-dessous ... getFragmentManager () est vraiment tout ce dont vous avez besoin.
Mark

4
Vous n'avez pas besoin de la variable globale mContext ici, utilisez simplement getActivity () partout où vous en avez besoin dans votre code. Veuillez modifier votre réponse afin de ne pas égarer les gens dans la mauvaise direction.
Varundroid

3
@Varundroid. J'accepte le fait que nous pouvons appeler getFragmentManager () à tout moment. Si vous pouvez m'envoyer votre identifiant de courrier électronique, je peux vous envoyer un exemple de code pour prouver qu'il y a des chances sur terre que getActivity () renvoie null.
Eldhose M Babu

1
@ androidplusios.design Vous devez appeler getFragmentManager () et non getSupportFragementManager dans votre fragment. getFragmentManager () est une fonction d'instance de la classe Fragment et vous pouvez donc l'appeler dans un Fragment et il prendra la référence d'instance actuelle de la classe Fragment contenant.
Eldhose M Babu

83

Tout ce que vous avez à faire est d'utiliser

getFragmentManager()

méthode sur votre fragment. Il vous donnera le gestionnaire de fragments de support, lorsque vous l'avez utilisé lors de l'ajout de ce fragment.

Documentation sur les fragments


8
Cela devrait être la réponse acceptée, il n'est pas conseillé de garder une référence à l'activité des parents comme suggéré par la première réponse.
Yoann Hercouet

1
@Mark c'est une réponse parfaite et devrait être la réponse acceptée.
Varundroid

3
Cela renverra android.app.Fragment. Dans certains cas, vous avez besoin de android.support.app.v4.Fragment pour ne pas fonctionner tout le temps.
codingpuss

1
Comment régler ceci? Je pense que j'ai besoin du support.app.v4.Fragment one
Dennis Lukas

5
Cela renverra le FragmentManager approprié. Si dans un android.support.app.v4.Fragment, il renverra la même chose que la méthode getSupportFragmentManager () dans Activity. La raison pour laquelle la méthode est appelée simplement getFragmentManager () dans ce cas est qu'elle n'est pas ambiguë, contrairement au cas d'Activity.
blunden

44

Obtenez-le simplement comme ça -

getFragmentManager() // This will also give you the SupportFragmentManager or FragmentManager based on which Fragment class you have extended - android.support.v4.app.Fragment OR android.app.Fragment.

OU

getActivity().getSupportFragmentManager();

dans la méthode onActivityCreated () de votre Fragment et dans toute méthode appelée après onActivityCreated ().


C'est ce que j'utilise, même si je suis assez nouveau dans le développement Android et que je ne suis pas sûr que ce soit la bonne façon de faire les choses.
Papipo

@codecaster, vous pouvez également obtenir le FragmentManager en utilisant la méthode getFragmentManager () de Fragment lui-même. J'ai édité ma réponse.
Varundroid

1
J'ai un projet ici qui a fait des choses étranges jusqu'à ce que j'échange getFragmentManager () pour getActivity.getSupportFragmentManager ().
Papipo

Hmmm étrange. Jamais rencontré un problème comme celui-ci jusqu'à présent, mais aucune des solutions ci-dessus n'est mauvaise, vous pouvez donc utiliser ce qui fonctionne pour vous.
Varundroid

2
J'ai regardé profondément dans les classes de tout le chemin. Il semble que c'est la meilleure solution qui utilise android.support.v4.app.Fragment
DearDhruv

16

Les utilisateurs de Kotlin essaient cette réponse

(activity as AppCompatActivity).supportFragmentManager

3
Heureusement que vous avez mis ça ici, sinon ça me rendrait fou Ty
MePo

@ GiedriusŠlikas ne travaille pas dans les fragments ou l'activité?
Ranjith Kumar

13

si vous rencontrez ce problème et que vous êtes au niveau de l'API 21+, procédez comme suit:

   map = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map))
                    .getMap();

cela obtiendra la carte lorsqu'elle est utilisée à l'intérieur d'un fragment.


1
J'ai essayé tous les correctifs de code suggérés ci-dessus, mais je n'ai pas réussi à les faire fonctionner. getChildFragmentManager () a fait l'affaire! THX.
John Ward

que diriez-vous du niveau d'API en dessous de 21? Api niveau 19 par exemple?
Aliton Oliveira

6

Vous pouvez utiliser à getActivity().getSupportFragmentManager()tout moment pour getSupportFragmentManager.

la hiérarchie est Activité -> fragment. fragment n'est pas capable d'appeler directement getSupportFragmentManger mais Activity le peut. Ainsi, vous pouvez utiliser getActivity pour appeler l'activité actuelle dans laquelle se trouve le fragment et obtenirgetSupportFragmentManager()


5

Mon activité parentale étend AppCompatActivity, j'ai donc dû convertir mon contexte en AppCompatActivity au lieu de simplement Activity.

par exemple.

FragmentAddProduct fragmentAddProduct = FragmentAddProduct.newInstance();
FragmentTransaction fragmentTransaction = ((AppCompatActivity)mcontext).getSupportFragmentManager().beginTransaction();

1
((AppCompatActivity) mContext)une partie était exactement ce que je cherchais. Je vous remercie!
sHOLE




3

en java, vous pouvez remplacer par

getChildFragmentManager()

à kotlin, simplifiez-vous en

childFragmentManager

j'espère que cela aidera :)


2

Le code suivant fait l'affaire pour moi

 SupportMapFragment mapFragment = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map));
    mapFragment.getMapAsync(this);


1

Vous pouvez simplement accéder comme

Context mContext;

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

mContext = getActivity();

}

puis utilisez

FragmentManager fm = ((FragmentActivity) mContext)
                        .getSupportFragmentManager();

1

Un peu de code Kotlin pour utiliser supportFragmentManager dans un fragment.

  override fun onCreateView(
      inflater: LayoutInflater,
      container: ViewGroup?,
      savedInstanceState: Bundle?

  ): View? {

    super.onCreateView(inflater, container, savedInstanceState)
    val rootView = inflater.inflate(R.layout.fragment_home, container, false)

    // ....

    if (rootView.home_play_btn != null) {

      rootView.home_play_btn.setOnClickListener {
        val fragment: BaseFragment = ListFragment.newInstance()
        val fragManager: FragmentManager = (activity as AppCompatActivity).supportFragmentManager
        fragManager.beginTransaction()
            .replace(R.id.content_home_frame, fragment, TAG).commit()

      }

0

getSupportFragmentManager() utilisé lorsque vous êtes en activité et que vous souhaitez obtenir un fragment mais dans le fragment auquel vous pouvez accéder

getSupportFragmentManager()

en utilisant une autre méthode appelée getFragmentMangaer()fonctionne de la même manière getSupportFragmentManager()et vous pouvez l'utiliser comme vous le faisiez auparavant:

fragmentTransaction =getFragmentManager().beginTransaction();

0

La nouvelle façon simple de le faire dans Kotlin

requireActivity().supportFragmentManager

-1

Essaye ça:

private SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getActivity().getSupportFragmentManager());

Quelle est votre exigence, je pense que votre exigence est de définir un pager à l'intérieur d'un autre pager à l'aide de fragments à l'intérieur de fragments ..! c'est-à-dire que vous avez besoin de glisser une mise en page dans une mise en page swippable?
Maddy

1
la raison pour laquelle @VJ vous a demandé d'élargir votre réponse est qu'une ligne de code n'est pas une réponse de bonne qualité. De nombreuses personnes autres que le demandeur initial de la question verront votre réponse et voudront peut-être l'utiliser pour résoudre leur propre problème. Il serait utile à ces utilisateurs si vous expliquiez réellement quel était le problème d'origine avec la question, pourquoi cela n'a pas fonctionné et pourquoi votre solution fonctionne.
psubsee2003
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.