Bir parçadaki getSupportFragmentManager () öğesine nasıl erişebilirim?


157

Bir FragmentActivity var ve içinde bir harita parçası kullanmak istiyorum. Destek parçası yöneticisine erişmek için bir sorunla karşılaşıyorum.

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

Yanıtlar:


278

Doğrudan arayabilirsin

getFragmentManager() 

parça yöneticisi almak için.

veya

Parçanızda,

Alan oluştur:

private FragmentActivity myContext;

parçanızın onAttach yöntemini geçersiz kıl:

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

Destek parçası yöneticisi araması almanız gerektiğinde:

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

veya

FragmentManager fragManager = myContext.getFragmentManager();

Bitirdiniz.


3
i işe ilk kez tıklayın ama bundan sonra başka bir parça devam sonra ben bu tıklayın boş sayfa gösterir ..
DjP

11
Bu bir ek yük. Aşağıdaki cevabımı görün ... getFragmentManager () gerçekten ihtiyacınız olan tek şey.
Mark

4
Burada global mContext değişkenine ihtiyacınız yoktur, kodunuzda ihtiyacınız olan her yerde getActivity () kullanın. Lütfen yanıtınızı düzenleyin, böylece insanları yanlış yönde yanlış yönlendirmeyin.
Varundroid

3
@Varundroid. Ben her zaman getFragmentManager () çağırabiliriz kabul ediyorum. Bana e-posta kimliğinizi gönderebilirseniz, getActivity () öğesinin null döndürme olasılığının olduğunu kanıtlamak için u örnek kodu gönderebilirim.
Eldhose M Babu

1
@ androidplusios.design Parçanızın içinde getSupportFragementManager değil, getFragmentManager () öğesini çağırmanız gerekir. getFragmentManager (), Fragment sınıfının bir örnek işlevidir ve bu nedenle u bir Fragment içinde çağırabilir ve içeren Fragment sınıfının geçerli örnek başvurusunu alır.
Eldhose M Babu

83

Tek yapmanız gereken kullanmak

getFragmentManager()

parçanızda yöntem. Bu parçayı eklerken kullandığınızda size destek parçası yöneticisini verecektir.

Parça Dokümantasyonu


8
Bu kabul edilen cevap olmalıdır, ilk cevapta önerildiği gibi ana faaliyete atıfta bulunulması tavsiye edilmez.
Yoann Hercouet

1
@ Bu mükemmel bir cevap ve kabul edilen cevap olmalı.
Varundroid

3
Bu android.app.Fragment dönecektir. Bazı durumlarda, android.support.app.v4.Fragment'a ihtiyacınız vardır, böylece her zaman çalışmayacaktır.
codingpuss

1
bu nasıl düzeltilir? Ben bir
Dennis Lukas

5
Bu, uygun FragmentManager öğesini döndürür. Bir android.support.app.v4.Fragment öğesindeyse, Etkinlik'teki getSupportFragmentManager () yöntemiyle aynı şeyi döndürür. Bu durumda yöntemin basitçe getFragmentManager () olarak adlandırılmasının nedeni, Etkinlik durumundan farklı olarak, belirsiz olmamasıdır.
17'de blunden

44

Basitçe şöyle olsun -

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.

VEYA

getActivity().getSupportFragmentManager();

Parçanızın onActivityCreated () yönteminde ve onActivityCreated () öğesinden sonra çağrılan herhangi bir yöntemde.


Android geliştirme konusunda oldukça yeniyim ve bir şeyler yapmanın doğru yolu olup olmadığından emin değilim.
Papipo

@codecaster, Fragment'ın kendisinin getFragmentManager () yöntemini kullanarak da FragmentManager'ı alabilirsiniz. Cevabımı düzenledim.
Varundroid

1
Burada getActivity.getSupportFragmentManager () için getFragmentManager () takas kadar garip şeyler yaptı bir proje var.
Papipo

Hmmm garip. Şimdiye kadar böyle bir sorunla karşılaşmadım, ancak yukarıdaki çözümlerin hiçbiri kötü değil, böylece sizin için uygun olanı kullanabilirsiniz.
Varundroid

2
Sınıflara derinlemesine baktım. Bu android.support.v4.app.Fragment kullanan en iyi çözüm gibi görünüyor.Fragment
DearDhruv

16

Kotlin kullanıcıları bu cevabı deniyor

(activity as AppCompatActivity).supportFragmentManager

3
Bunu buraya koyduğunuz iyi bir şey, aksi takdirde beni deli eder Ty
MePo

@ GiedriusŠlikas fragmanlarda veya etkinliklerde çalışmıyor mu?
Ranjith Kumar

13

Bu sorunla karşılaşırsanız ve 21+ api düzeyindeyseniz bunu yapın:

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

bu, bir parçanın içinde kullanıldığında haritayı alır.


1
Yukarıda önerilen kod düzeltmelerinin tümünü denedim, ancak herhangi bir işe yaramadı. getChildFragmentManager () hile yaptı! Teşekkürler.
John Ward

21'in altında api seviyesine ne dersin? Örneğin Api seviye 19?
Aliton Oliveira

6

getActivity().getSupportFragmentManager()SupportFragmentManager'ı istediğiniz zaman kullanabilirsiniz .

hiyerarşi Etkinlik -> parçasıdır. fragment doğrudan getSupportFragmentManger öğesini çağıramaz, ancak Activity bunu yapabilir. Böylece, parçanın içinde bulunduğu geçerli etkinliği çağırmak ve almak için getActivity'yi kullanabilirsiniz.getSupportFragmentManager()


6

Üst Etkinliğim AppCompatActivity'yi genişlettiğinden bağlamımı yalnızca Etkinlik yerine AppCompatActivity'ye yayınlamak zorunda kaldım.

Örneğin.

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

2
((AppCompatActivity) mContext)parçası tam olarak ne aradığını oldu. Teşekkür ederim!
sHOLE




3

java ile değiştirebilirsiniz

getChildFragmentManager()

kotlin'de basitleştir

childFragmentManager

umarım yardımcı olur :)


2

Aşağıdaki kod benim için hile yapar

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


1

Şunun gibi erişebilirsiniz:

Context mContext;

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

mContext = getActivity();

}

ve sonra kullan

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

1

Bir Fragment içinde supportFragmentManager'ı kullanmak için bazı Kotlin kodları.

  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() etkinlikteyken ve bir parça almak istediğinizde kullanılır, ancak parçada

getSupportFragmentManager()

başka bir yöntem getFragmentMangaer()kullanarak aynı şekilde çalışır getSupportFragmentManager()ve alıştığınız gibi kullanabilirsiniz:

fragmentTransaction =getFragmentManager().beginTransaction();

0

Kotlin'de yapmanın basit yeni yolu

requireActivity().supportFragmentManager

-1

Bunu dene:

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

İhtiyacınız nedir, ihtiyacın başka bir çağrı cihazı içinde bir çağrı cihazı fragmanların yardımıyla tanımlamak olduğunu düşünüyorum ..! yani bir düzeni kaydırılabilir bir düzen içinde kaydırmanız gerekir?
Maddy

1
@VJ'nin cevabınızı genişletmenizi istemesinin nedeni, bir kod satırının kaliteli bir cevap olmamasıdır. Sorunun asıl askerinden başka birçok kişi cevabınızı görecek ve kendi problemlerini çözmek için kullanmak isteyebilir. Sorunun asıl sorununun ne olduğunu, neden işe yaramadığını ve çözümün neden işe yaradığını açıkladıysanız bu kullanıcılara yardımcı olacaktır.
psubsee2003
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.