Jak mogę uzyskać dostęp do getSupportFragmentManager () we fragmencie?


157

Mam FragmentActivity i chcę w nim użyć fragmentu mapy. Mam problem z uzyskaniem dostępu do menedżera fragmentów wsparcia.

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

Odpowiedzi:


278

Możesz bezpośrednio zadzwonić

getFragmentManager() 

aby uzyskać menedżera fragmentów.

lub

W twoim fragmencie

Utwórz pole:

private FragmentActivity myContext;

override onAttach metody twojego fragmentu:

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

Kiedy potrzebujesz uzyskać połączenie z menedżerem fragmentów wsparcia:

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

lub

FragmentManager fragManager = myContext.getFragmentManager();

Skończyłeś.


3
kiedy klikam po raz pierwszy, to działa, ale po tym, gdy ponownie przechodzę do innego fragmentu, klikam to, pokazuje pustą stronę ..
— DjP

11
To jest narzut. Zobacz moją odpowiedź poniżej ... getFragmentManager () to naprawdę wszystko, czego potrzebujesz.
— Mark

4
Nie potrzebujesz tutaj globalnej zmiennej mContext, po prostu użyj getActivity () wszędzie tam, gdzie jej potrzebujesz. Zmień swoją odpowiedź, aby nie wprowadzać ludzi w błąd.
— Varundroid,

3
@Varundroid. Zgadzam się, że w każdej chwili możemy wywołać metodę getFragmentManager (). Jeśli możesz przesłać mi swój identyfikator e-mail, mogę wysłać przykładowy kod, aby udowodnić, że na świecie istnieją szanse, aby getActivity () zwróciło wartość null.
— Eldhose M Babu

1
@ androidplusios.design Musisz wywołać getFragmentManager (), a nie getSupportFragementManager wewnątrz swojego fragmentu. getFragmentManager () jest funkcją instancji klasy Fragment, więc możesz wywołać ją wewnątrz Fragmentu i pobierze ona aktualne odwołanie do instancji zawierającej klasę Fragment.
— Eldhose M Babu

83

Wszystko, co musisz zrobić, to użyć

getFragmentManager()

metoda na twoim fragmencie. To da ci menedżera fragmentów wsparcia, gdy użyłeś go podczas dodawania tego fragmentu.

Dokumentacja fragmentów


8
Powinna to być akceptowana odpowiedź, nie zaleca się zachowywania odniesienia do działalności rodzica, jak sugeruje pierwsza odpowiedź.
— Yoann Hercouet

1
@ Zaznacz, że to doskonała odpowiedź i powinna być akceptowaną odpowiedzią.
— Varundroid,

3
Spowoduje to zwrócenie android.app.Fragment. W niektórych przypadkach potrzebny jest android.support.app.v4.Fragment, aby nie działał przez cały czas.
— codingpuss

1
jak to naprawić? Myślę, że potrzebuję support.app.v4.Fragment one
— Dennis Lukas

5
Spowoduje to zwrócenie odpowiedniego menedżera fragmentu FragmentManager. Jeśli w android.support.app.v4.Fragment zwróci to samo, co zrobiłaby metoda getSupportFragmentManager () w Activity. Powodem, dla którego metoda nazywa się po prostu getFragmentManager () w tym przypadku, jest to, że nie jest niejednoznaczna, w przeciwieństwie do przypadku Activity.
— blunden

44

Po prostu zrozum to w ten sposób -

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.

LUB

getActivity().getSupportFragmentManager();

w metodzie onActivityCreated () Twojego Fragmentu i każdej metodzie wywoływanej po onActivityCreated ().


To jest to, czego używam, chociaż jestem całkiem nowy w programowaniu na Androida i nie jestem pewien, czy jest to właściwy sposób robienia rzeczy.
— Papipo

@codecaster możesz pobrać FragmentManager za pomocą metody getFragmentManager () samego fragmentu. Zmieniłem odpowiedź.
— Varundroid

1
Mam tutaj projekt, który robił dziwne rzeczy, dopóki nie zamieniłem getFragmentManager () na getActivity.getSupportFragmentManager ().
— Papipo

Hmmm dziwne. Do tej pory nigdy nie spotkałem się z takim problemem, ale żadne z powyższych rozwiązań nie jest złe, więc możesz użyć tego, co działa dla Ciebie.
— Varundroid,

2
Wniknąłem głęboko w zajęcia od początku. Wygląda na to, że jest to najlepsze rozwiązanie, które używa android.support.v4.app.Fragment
— DrogiDhruv

16

Użytkownicy Kotlin próbują tej odpowiedzi

(activity as AppCompatActivity).supportFragmentManager

3
Dobrze, że umieściłeś to tutaj, w przeciwnym razie doprowadziłoby mnie to do szaleństwa Ty
— MePo

@ GiedriusŠlikas nie działa we fragmentach lub w działaniu?
— Ranjith Kumar

13

jeśli masz ten problem i jesteś na poziomie API 21+, zrób to:

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

to dostanie mapę, gdy zostanie użyta wewnątrz fragmentu.


1
Wypróbowałem wszystkie sugerowane poprawki kodu powyżej, ale nie udało mi się uruchomić żadnej z nich. getChildFragmentManager () załatwiło sprawę! Dzięki.
— John Ward

co powiesz na poziom api poniżej 21? Na przykład poziom API 19?
— Aliton Oliveira

6

Możesz użyć getActivity().getSupportFragmentManager() kiedy tylko chcesz, aby getSupportFragmentManager.

hierarchia to Aktywność -> fragment. fragment nie jest w stanie bezpośrednio wywołać getSupportFragmentManger, ale Activity to robi. W ten sposób możesz użyć getActivity, aby wywołać bieżące działanie, w którym znajduje się fragment, i pobraćgetSupportFragmentManager()


5

Moja aktywność nadrzędna rozszerza AppCompatActivity, więc musiałem rzutować mój kontekst na AppCompatActivity zamiast tylko Activity.

na przykład.

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

1
((AppCompatActivity) mContext)część była DOKŁADNIE tym, czego szukałem. Dziękuję Ci!
— sHOLE




3

w java możesz zamienić na

getChildFragmentManager()

w kotlin, uprość to przez

childFragmentManager

mam nadzieję, że pomoże :)


2

Poniższy kod załatwia sprawę

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


1

Możesz po prostu uzyskać dostęp do polubień

Context mContext;

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

mContext = getActivity();

}

a następnie użyj

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

1

Jakiś kod Kotlin do użycia supportFragmentManager wewnątrz fragmentu.

  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() używane, gdy jesteś aktywny i chcesz uzyskać fragment, ale we fragmencie, do którego masz dostęp

getSupportFragmentManager()

używając innej metody o nazwie getFragmentMangaer()działa tak samo getSupportFragmentManager()i możesz jej używać tak, jak kiedyś:

fragmentTransaction =getFragmentManager().beginTransaction();

0

Prosty nowy sposób na zrobienie tego w Kotlinie

requireActivity().supportFragmentManager

-1

Spróbuj tego:

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

Jakie jest twoje wymaganie, myślę, że twoim wymaganiem jest zdefiniowanie pagera wewnątrz innego pagera za pomocą fragmentów wewnątrz fragmentów ..! tj. musisz przesunąć układ wewnątrz układu, który można przesuwać?
— Maddy,

1
powodem, dla którego @VJ poprosił cię o rozwinięcie odpowiedzi, jest to, że wiersz kodu nie jest odpowiedzią dobrej jakości. Wiele osób innych niż pierwotnie zadający pytanie zobaczy Twoją odpowiedź i może zechcieć użyć jej do rozwiązania własnego problemu. Byłoby pomocne dla tych użytkowników, gdybyś rzeczywiście wyjaśnił, na czym polegał pierwotny problem z pytaniem, dlaczego nie zadziałał i dlaczego rozwiązanie działa.
— psubsee2003
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.