¿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);

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.


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


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 ().


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

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.


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()


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();

1
((AppCompatActivity) mContext)parte era EXACTAMENTE lo que estaba buscando. ¡Gracias!
HOYO




3

en java puedes reemplazar con

getChildFragmentManager()

en kotlin, hazlo simple

childFragmentManager

espero que ayude :)


2

El siguiente código hace el truco para mí

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


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();

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()

      }

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();

0

La nueva forma simple de hacerlo en Kotlin

requireActivity().supportFragmentManager

-1

Prueba esto:

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

¡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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.