Wie kann ich in einem Fragment auf getSupportFragmentManager () zugreifen?

157

Ich habe eine FragmentActivity und möchte ein Kartenfragment darin verwenden. Ich habe ein Problem damit, dass der Support-Fragment-Manager darauf zugreifen kann.

 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
quelle

Antworten:

277

Sie können direkt anrufen

getFragmentManager() 

um den Fragmentmanager zu bekommen.

oder

In Ihrem Fragment

Feld erstellen:

private FragmentActivity myContext;

überschreiben Sie die onAttach-Methode Ihres Fragments:

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

Wenn Sie den Support Fragment Manager-Aufruf benötigen:

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

oder

FragmentManager fragManager = myContext.getFragmentManager();

Du bist fertig.

Eldhose M Babu
quelle
3
Wenn ich zum ersten Mal
klicke,
11
Dies ist ein Overhead. Siehe meine Antwort unten ... getFragmentManager () ist wirklich alles was Sie brauchen.
Mark
4
Sie benötigen hier keine globale mContext-Variable. Verwenden Sie einfach getActivity (), wo immer Sie es in Ihrem Code benötigen. Bitte bearbeiten Sie Ihre Antwort, damit Sie die Leute nicht in die falsche Richtung führen.
Varundroid
3
@ Varundroid. Ich stimme der Tatsache zu, dass wir getFragmentManager () jederzeit aufrufen können. Wenn Sie mir Ihre E-Mail-ID senden können, kann ich Ihnen einen Beispielcode senden, um zu beweisen, dass es auf der Erde Chancen gibt, dass getActivity () null zurückgibt.
Eldhose M Babu
1
@ androidplusios.design Sie müssen getFragmentManager () und nicht getSupportFragementManager in Ihrem Fragment aufrufen. getFragmentManager () ist eine Instanzfunktion der Fragment-Klasse. Sie können sie also innerhalb eines Fragments aufrufen und die aktuelle Instanzreferenz der enthaltenen Fragment-Klasse übernehmen.
Eldhose M Babu
83

Alles was Sie tun müssen, ist zu verwenden

getFragmentManager()

Methode auf Ihrem Fragment. Sie erhalten den Support-Fragment-Manager, wenn Sie ihn beim Hinzufügen dieses Fragments verwendet haben.

Fragmentdokumentation

Kennzeichen
quelle
8
Dies sollte die akzeptierte Antwort sein. Es wird nicht empfohlen, einen Verweis auf die übergeordnete Aktivität zu behalten, wie in der ersten Antwort vorgeschlagen.
Yoann Hercouet
1
@ Mark Dies ist eine perfekte Antwort und sollte die akzeptierte Antwort sein.
Varundroid
3
Dies gibt android.app.Fragment zurück. In einigen Fällen benötigen Sie android.support.app.v4.Fragment, damit es nicht immer funktioniert.
Codingpuss
1
Wie kann man das beheben? Ich denke, ich brauche die support.app.v4.Fragment eins
Dennis Lukas
5
Dadurch wird der entsprechende FragmentManager zurückgegeben. In einem android.support.app.v4.Fragment wird dasselbe zurückgegeben wie in der getSupportFragmentManager () -Methode in Activity. Der Grund, warum die Methode in diesem Fall einfach getFragmentManager () heißt, ist, dass sie im Gegensatz zu Activity nicht mehrdeutig ist.
Blunden
44

Einfach so machen -

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.

ODER

getActivity().getSupportFragmentManager();

in der onActivityCreated () -Methode Ihres Fragments und in jeder Methode, die nach onActivityCreated () aufgerufen wird.

Varundroid
quelle
Dies ist, was ich benutze, obwohl ich ziemlich neu in der Android-Entwicklung bin und nicht sicher bin, ob es die richtige Art ist, Dinge zu tun.
Papipo
@codecaster Sie können den FragmentManager auch mit der Methode getFragmentManager () von Fragment selbst abrufen. Ich habe meine Antwort bearbeitet.
Varundroid
1
Ich habe hier ein Projekt, das seltsame Dinge getan hat, bis ich getFragmentManager () gegen getActivity.getSupportFragmentManager () ausgetauscht habe.
Papipo
Hmmm seltsam. Bisher ist noch nie ein solches Problem aufgetreten, aber keine der oben genannten Lösungen ist schlecht, sodass Sie alles verwenden können, was für Sie funktioniert.
Varundroid
2
Ich habe von Anfang an tief in den Unterricht geschaut. Dies scheint die beste Lösung zu sein, die android.support.v4.app.Fragment
DearDhruv
16

Kotlin-Benutzer versuchen diese Antwort

(activity as AppCompatActivity).supportFragmentManager
Ranjith Kumar
quelle
3
Gut, dass Sie dies hier eingestellt haben, sonst würde es mich verrückt machen Ty
MePo
@ GiedriusŠlikas arbeitet nicht in Fragmenten oder Aktivitäten?
Ranjith Kumar
13

Wenn Sie dieses Problem haben und sich auf API-Level 21+ befinden, gehen Sie wie folgt vor:

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

Dadurch wird die Karte abgerufen, wenn sie innerhalb eines Fragments verwendet wird.

bsautner
quelle
1
Ich habe alle oben vorgeschlagenen Codekorrekturen ausprobiert, konnte jedoch keine zum Laufen bringen. getChildFragmentManager () hat es geschafft! Vielen Dank.
John Ward
Wie wäre es mit API-Level unter 21? API Level 19 zum Beispiel?
Aliton Oliveira
6

Sie können getActivity().getSupportFragmentManager()jederzeit verwenden, um SupportSragmentManager zu erhalten.

Hierarchie ist Aktivität -> Fragment. fragment kann getSupportFragmentManger nicht direkt aufrufen, Activity jedoch. Daher können Sie getActivity verwenden, um die aktuelle Aktivität, in der sich das Fragment befindet, aufzurufen und abzurufengetSupportFragmentManager()

Emil Reña Enriquez
quelle
5

Meine übergeordnete Aktivität erweitert AppCompatActivity, sodass ich meinen Kontext in AppCompatActivity anstatt nur in Aktivität umwandeln musste.

z.B.

FragmentAddProduct fragmentAddProduct = FragmentAddProduct.newInstance();
FragmentTransaction fragmentTransaction = ((AppCompatActivity)mcontext).getSupportFragmentManager().beginTransaction();
Akinola Olayinka
quelle
1
((AppCompatActivity) mContext)Teil war genau das, wonach ich gesucht habe. Danke dir!
SHOLE
3

Mach das in deinem Fragment

getActivity().getSupportFragmentManager()
philip mudenyo
quelle
3

getActivity().getFragmentManager() Das hat funktioniert oder ich.

Schauen Sie sich auch hier an.

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

In Java können Sie durch ersetzen

getChildFragmentManager()

Machen Sie es in Kotlin einfach durch

childFragmentManager

hoffe es hilft :)

Wanja Rachel
quelle
2

Der folgende Code macht den Trick für mich

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

Sie können childFragmentManager in Fragmenten verwenden.

Kishan Solanki
quelle
1

Sie können einfach auf like zugreifen

Context mContext;

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

mContext = getActivity();

}

und dann verwenden

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

Einige Kotlin-Codes zur Verwendung von supportFragmentManager in einem 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
quelle
0

getSupportFragmentManager() Wird verwendet, wenn Sie in Aktivität sind und ein Fragment erhalten möchten, aber auf das Fragment können Sie zugreifen

getSupportFragmentManager()

Wenn Sie eine andere Methode verwenden, getFragmentMangaer()die genauso funktioniert getSupportFragmentManager(), können Sie sie wie früher verwenden:

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

Die einfache neue Art, es in Kotlin zu tun

requireActivity().supportFragmentManager
Reza
quelle
-1

Versuche dies:

private SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getActivity().getSupportFragmentManager());
Maddy
quelle
Was ist Ihre Anforderung? Ich denke, Ihre Anforderung besteht darin, einen Pager in einem anderen Pager mit Hilfe von Fragmenten in Fragmenten zu definieren. dh Sie müssen ein Layout innerhalb eines swippbaren Layouts wischen?
Maddy
1
Der Grund, warum @VJ Sie gebeten hat, Ihre Antwort zu erweitern, ist, dass eine Codezeile keine qualitativ hochwertige Antwort ist. Viele andere Personen als der ursprüngliche Fragesteller sehen Ihre Antwort und möchten sie möglicherweise verwenden, um ihr eigenes Problem zu lösen. Für diese Benutzer wäre es hilfreich, wenn Sie tatsächlich erklären würden, was das ursprüngliche Problem mit der Frage war, warum es nicht funktioniert hat und warum Ihre Lösung funktioniert.
Psubsee2003