Come posso accedere a getSupportFragmentManager () in un frammento?


157

Ho un FragmentActivity e voglio usare un frammento di mappa al suo interno. Sto riscontrando un problema a ottenere l'accesso al gestore dei frammenti di supporto.

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

Risposte:


278

Puoi chiamare direttamente

getFragmentManager() 

per ottenere il gestore dei frammenti.

o

Nel tuo frammento,

Crea campo:

private FragmentActivity myContext;

ignora il metodo Attach del tuo frammento:

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

Quando è necessario ottenere la chiamata del gestore frammenti di supporto:

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

o

FragmentManager fragManager = myContext.getFragmentManager();

Hai fatto.


3
quando clicco la prima volta che funziona, ma dopo di ciò su un altro frammento di nuovo
faccio

11
Questo è un sovraccarico. Vedi la mia risposta qui sotto ... getFragmentManager () è davvero tutto ciò di cui hai bisogno.
Mark

4
Non hai bisogno della variabile mContext globale qui, usa semplicemente getActivity () ovunque nel tuo codice ti serva. Modifica la tua risposta in modo da non fuorviare le persone nella direzione sbagliata.
Varundroid il

3
@Varundroid. Sono d'accordo sul fatto che possiamo chiamare getFragmentManager () in qualsiasi momento. Se puoi inviarmi il tuo ID e-mail, posso inviarti un codice di esempio per dimostrare che ci sono possibilità sulla Terra che getActivity () restituisca null.
Eldhose M Babu,

1
@ androidplusios.design Devi chiamare getFragmentManager () e non getSupportFragementManager all'interno del tuo frammento. getFragmentManager () è una funzione di istanza della classe Fragment e quindi puoi chiamarla all'interno di un frammento e prenderà l'attuale riferimento all'istanza della classe Fragment contenente.
Eldhose M Babu,

83

Tutto quello che devi fare è usare

getFragmentManager()

metodo sul tuo frammento. Ti darà il gestore dei frammenti di supporto, quando lo hai usato mentre aggiungevi questo frammento.

Documentazione sui frammenti


8
Questa dovrebbe essere la risposta accettata, non è consigliabile mantenere un riferimento all'attività dei genitori come suggerito dalla prima risposta.
Yoann Hercouet,

1
@Mark questa è una risposta perfetta e dovrebbe essere la risposta accettata.
Varundroid,

3
Questo restituirà android.app.Fragment. In alcuni casi, è necessario android.support.app.v4.Fragment in modo che non funzioni sempre.
codingpuss

1
come risolvere questo? penso di aver bisogno del support.app.v4.Fragment one
Dennis Lukas,

5
Questo restituirà il FragmentManager appropriato. Se in un android.support.app.v4.Fragment, restituirà la stessa cosa del metodo getSupportFragmentManager () in Activity. Il motivo per cui il metodo è chiamato semplicemente getFragmentManager () in questo caso è perché non è ambiguo, a differenza del caso di Activity.
sbiancato il

44

Prendi semplicemente così -

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

nel metodo onActivityCreated () del tuo frammento e in qualsiasi metodo chiamato dopo onActivityCreated ().


Questo è quello che uso, anche se sono abbastanza nuovo nello sviluppo di Android e non sono sicuro che sia il modo corretto di fare le cose.
Papipo,

@codecaster è possibile ottenere FragmentManager usando anche il metodo getFragmentManager () del frammento stesso. Ho modificato la mia risposta.
Varundroid,

1
Ho un progetto qui che ha fatto cose strane fino a quando non ho scambiato getFragmentManager () per getActivity.getSupportFragmentManager ().
Papipo,

Hmmm strano. Finora non ho mai riscontrato un problema come questo, ma nessuna delle soluzioni di cui sopra è male, quindi puoi usare tutto ciò che funziona per te.
Varundroid,

2
Ho studiato a fondo le lezioni da ogni parte. Sembra che questa sia la migliore soluzione che utilizza android.support.v4.app.Fragment
DearDhruv,


13

se hai questo problema e sei al livello di API 21+ fai questo:

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

questo otterrà la mappa se usata all'interno di un frammento.


1
Ho provato tutte le correzioni di codice suggerite sopra, ma non sono riuscito a farle funzionare. getChildFragmentManager () ha fatto il trucco! Grazie.
John Ward,

che ne dici di un livello API inferiore a 21? Api livello 19 per esempio?
Aliton Oliveira,

6

Puoi usare getActivity().getSupportFragmentManager() quando vuoi getSupportFragmentManager.

la gerarchia è Attività -> frammento. fragment non è in grado di chiamare direttamente getSupportFragmentManger ma Activity può. Pertanto, è possibile utilizzare getActivity per chiamare l'attività corrente in cui si trova il frammento e otteneregetSupportFragmentManager()


5

La mia attività principale estende AppCompatActivity, quindi ho dovuto trasmettere il mio contesto a AppCompatActivity anziché solo Activity.

per esempio.

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

1
((AppCompatActivity) mContext)la parte era ESATTAMENTE quello che stavo cercando. Grazie!
FORO




3

in Java puoi sostituirlo con

getChildFragmentManager()

in kotlin, rendilo semplice da

childFragmentManager

spero che ti aiuti :)


2

Il seguente codice fa il trucco per me

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


1

Puoi semplicemente accedere come

Context mContext;

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

mContext = getActivity();

}

e quindi usare

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

1

Alcuni codici Kotlin per usare supportFragmentManager all'interno di un frammento.

  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() usato quando sei in attività e vuoi ottenere un frammento ma nel frammento puoi accedervi

getSupportFragmentManager()

usando un altro metodo chiamato getFragmentMangaer()funziona allo stesso modo getSupportFragmentManager()e puoi usarlo come una volta:

fragmentTransaction =getFragmentManager().beginTransaction();

0

Il semplice nuovo modo di farlo in kotlin

requireActivity().supportFragmentManager

-1

Prova questo:

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

Qual è il tuo requisito, penso che il tuo requisito sia quello di definire un cercapersone all'interno di un altro cercapersone con l'aiuto di frammenti all'interno di frammenti ..! cioè devi scorrere un layout all'interno di un layout swippable?
Maddy,

1
il motivo per cui @VJ ti ha chiesto di espandere la tua risposta è perché una riga di codice non è una risposta di buona qualità. Molte persone diverse dalla domanda originale vedranno la tua risposta e potrebbero voler usarla per risolvere il proprio problema. Sarebbe utile per quegli utenti se in realtà spiegassi qual era il problema originale con la domanda, perché non ha funzionato e perché la tua soluzione funziona.
psubsee2003,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.