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.