¿Cómo puedo acceder a getSupportFragmentManager () en un fragmento?

157

Tengo una FragmentActivity y quiero usar un fragmento de mapa dentro de ella. Tengo un problema para que el administrador de fragmentos de soporte acceda a él.

 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);
DjP
fuente

Respuestas:

278

Puedes llamar directamente

getFragmentManager() 

para obtener el administrador de fragmentos.

o

En tu fragmento

Crear campo:

private FragmentActivity myContext;

anular el método onAttach de su fragmento:

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

Cuando necesite obtener una llamada al administrador de fragmentos de soporte:

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

o

FragmentManager fragManager = myContext.getFragmentManager();

Estás listo.

Eldhose M Babu
fuente
3
cuando hago clic primera vez que funcione, pero después de eso va en algún otro fragmento de nuevo que haga clic en este se muestra una página en blanco ..
DJP
11
Esta es una sobrecarga. Vea mi respuesta a continuación ... getFragmentManager () es realmente todo lo que necesita.
Mark
44
No necesita la variable global mContext aquí, solo use getActivity () donde sea que lo necesite en su código. Edite su respuesta para no desviar a las personas en la dirección equivocada.
Varundroid
3
@Varundroid. Estoy de acuerdo con el hecho de que podemos llamar a getFragmentManager () en cualquier momento. Si puede enviarme su ID de correo electrónico, puedo enviarle un código de muestra para demostrar que hay posibilidades en el mundo de que getActivity () devuelva nulo.
Eldhose M Babu
1
@ androidplusios.design Debe llamar a getFragmentManager () y no getSupportFragementManager dentro de su fragmento. getFragmentManager () es una función de instancia de la clase Fragment, por lo que puede llamarlo dentro de un Fragment y tomará la referencia de instancia actual de la clase Fragment que lo contiene.
Eldhose M Babu
83

Todo lo que necesitas hacer es usar

getFragmentManager()

Método en su fragmento. Le dará el administrador de fragmentos de soporte, cuando lo usó al agregar este fragmento.

Documentación de fragmentos

marca
fuente
8
Esta debería ser la respuesta aceptada, no se recomienda mantener una referencia a la actividad de los padres como sugiere la primera respuesta.
Yoann Hercouet
1
@ Mark esta es una respuesta perfecta y debe ser la respuesta aceptada.
Varundroid
3
Esto devolverá android.app.Fragment. En algunos casos, necesita android.support.app.v4.Fragment para que no funcione todo el tiempo.
codingpuss
1
¿Cómo arreglar esto? Creo que necesito el support.app.v4.Fragmento uno
Dennis Lukas
55
Esto devolverá el FragmentManager apropiado. Si está en un android.support.app.v4.Fragment, devolverá lo mismo que lo haría el método getSupportFragmentManager () en Activity. La razón por la cual el método se llama simplemente getFragmentManager () en este caso es porque no es ambiguo, a diferencia del caso de Activity.
blunden
44

Simplemente hazlo así:

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.

O

getActivity().getSupportFragmentManager();

en el método onActivityCreated () de su Fragment y cualquier método que se llame después de onActivityCreated ().

Varundroid
fuente
Esto es lo que uso, aunque soy bastante nuevo en el desarrollo de Android y no estoy seguro de si es la forma correcta de hacer las cosas.
Papipo
@codecaster puede obtener el FragmentManager usando el método getFragmentManager () de Fragment también. He editado mi respuesta.
Varundroid
1
Tengo un proyecto aquí que hizo cosas raras hasta que cambié getFragmentManager () por getActivity.getSupportFragmentManager ().
Papipo
Hmmm extraño. Nunca se topó con un problema como este hasta ahora, pero ninguna de las soluciones anteriores es mala, por lo que puede usar lo que sea que le funcione.
Varundroid
2
He investigado profundamente las clases desde todo el camino. Parece que esta es la mejor solución que usa android.support.v4.app.Fragment
DearDhruv
16

Los usuarios de Kotlin prueban esta respuesta

(activity as AppCompatActivity).supportFragmentManager
Ranjith Kumar
fuente
3
Es bueno que hayas puesto esto aquí, de lo contrario me volvería loco Ty
MePo
@ GiedriusŠlikas no trabaja en fragmentos o actividad?
Ranjith Kumar
13

Si tiene este problema y está en el nivel 21+ de la API, haga esto:

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

esto obtendrá el mapa cuando se use dentro de un fragmento.

bsautner
fuente
1
Intenté todas las correcciones de código sugeridas anteriormente, pero no pude hacer que ninguna de ellas funcionara. getChildFragmentManager () hizo el truco! Gracias.
John Ward, el
¿Qué tal un nivel de API por debajo de 21? Api nivel 19 por ejemplo?
Aliton Oliveira
6

Puede usarlo en getActivity().getSupportFragmentManager()cualquier momento que desee obtenerSupportFragmentManager.

jerarquía es Actividad -> fragmento. fragment no es capaz de llamar directamente a getSupportFragmentManger, pero Activity puede. Por lo tanto, puede usar getActivity para llamar a la actividad actual en la que se encuentra el fragmento y obtenergetSupportFragmentManager()

Emil Reña Enriquez
fuente
5

My Parent Activity amplía AppCompatActivity, así que tuve que transmitir mi contexto a AppCompatActivity en lugar de solo Activity.

p.ej.

FragmentAddProduct fragmentAddProduct = FragmentAddProduct.newInstance();
FragmentTransaction fragmentTransaction = ((AppCompatActivity)mcontext).getSupportFragmentManager().beginTransaction();
Akinola Olayinka
fuente
1
((AppCompatActivity) mContext)parte era EXACTAMENTE lo que estaba buscando. ¡Gracias!
HOYO
3

haz esto en tu fragmento

getActivity().getSupportFragmentManager()
philip mudenyo
fuente
3

getActivity().getFragmentManager() Esto funcionó o yo.

También eche un vistazo aquí.

Aravindh Gopi
fuente
3
((AppCompatActivity) getActivity()).getSupportFragmentManager()
Diako Hasani
fuente
3

en java puedes reemplazar con

getChildFragmentManager()

en kotlin, hazlo simple

childFragmentManager

espero que ayude :)

Vanya Rachel
fuente
2

El siguiente código hace el truco para mí

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

Puede usar childFragmentManager dentro de Fragments.

Kishan Solanki
fuente
1

Simplemente puede acceder como

Context mContext;

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

mContext = getActivity();

}

y luego usar

FragmentManager fm = ((FragmentActivity) mContext)
                        .getSupportFragmentManager();
Ashwini.patil
fuente
1

Algún código de Kotlin para usar supportFragmentManager dentro de 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()

      }
noelmcloughlin
fuente
0

getSupportFragmentManager() Se utiliza cuando está en actividad y quiere obtener un fragmento, pero en el fragmento puede acceder

getSupportFragmentManager()

mediante el uso de otro método llamado getFragmentMangaer()funciona igual getSupportFragmentManager()y puede usarlo como solía hacerlo:

fragmentTransaction =getFragmentManager().beginTransaction();
Mohamed Ayed
fuente
0

La nueva forma simple de hacerlo en Kotlin

requireActivity().supportFragmentManager
Reza
fuente
-1

Prueba esto:

private SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getActivity().getSupportFragmentManager());
Maddy
fuente
¡Cuál es su requisito, creo que su requisito es definir un localizador dentro de otro localizador con la ayuda de fragmentos dentro de fragmentos ...! es decir, necesita deslizar un diseño dentro de un diseño intercambiable?
Maddy
1
La razón por la que @VJ le pidió que expanda su respuesta es porque una línea de código no es una respuesta de buena calidad. Muchas personas que no sean el autor original de la pregunta verán su respuesta y tal vez quieran usarla para resolver su propio problema. Sería útil para esos usuarios si realmente explicara cuál era el problema original con la pregunta, por qué no funcionó y por qué su solución sí funciona.
psubsee2003