Bagaimana saya bisa mengakses getSupportFragmentManager () dalam sebuah fragmen?

157

Saya memiliki FragmentActivity dan saya ingin menggunakan fragmen peta di dalamnya. Saya mengalami masalah dalam meminta pengelola fragmen dukungan untuk mengaksesnya.

 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
sumber

Jawaban:

278

Anda bisa langsung menelepon

getFragmentManager() 

untuk mendapatkan manajer fragmen.

atau

Dalam fragmen Anda,

Buat bidang:

private FragmentActivity myContext;

timpa metode onAttach fragmen Anda:

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

Ketika Anda perlu mendapatkan panggilan Manajer fragmen dukungan:

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

atau

FragmentManager fragManager = myContext.getFragmentManager();

Kamu selesai.

Eldhose M Babu
sumber
3
ketika saya mengklik pertama kali itu bekerja tetapi setelah itu terjadi beberapa fragmen lain lagi saya klik ini menunjukkan halaman kosong ..
DjP
11
Ini adalah overhead. Lihat jawaban saya di bawah ini ... getFragmentManager () benar-benar yang Anda butuhkan.
Markus
4
Anda tidak memerlukan variabel global mContext di sini, cukup gunakan getActivity () di mana pun dalam kode yang Anda perlukan. Harap edit jawaban Anda sehingga Anda tidak menyesatkan orang ke arah yang salah.
Varundroid
3
@ Varundroid. Saya menyetujui fakta bahwa kita dapat memanggil getFragmentManager () kapan saja. Jika Anda dapat mengirim saya Id email Anda, saya dapat mengirimkan kode sampel untuk membuktikan bahwa ada peluang di getActivity () untuk mengembalikan nol.
Eldhose M Babu
1
@ androidplusios.design Anda perlu memanggil getFragmentManager () dan tidak getSupportFragementManager di dalam fragmen Anda. getFragmentManager () adalah fungsi instance dari kelas Fragment dan jadi Anda dapat memanggilnya di dalam Fragment dan akan mengambil referensi instance kelas Fragment yang berisi saat ini.
Eldhose M Babu
83

Yang perlu Anda lakukan hanyalah menggunakan

getFragmentManager()

metode pada fragmen Anda. Ini akan memberi Anda manajer fragmen dukungan, ketika Anda menggunakannya sambil menambahkan fragmen ini.

Dokumentasi fragmen

Menandai
sumber
8
Ini harus menjadi jawaban yang diterima, tidak disarankan untuk menyimpan referensi ke aktivitas orang tua seperti yang disarankan oleh jawaban pertama.
Yoann Hercouet
1
@ Markus ini adalah jawaban yang sempurna dan harus menjadi jawaban yang diterima.
Varundroid
3
Ini akan mengembalikan android.app.Fragment. Dalam beberapa kasus, Anda memerlukan android.support.app.v4.Fragment sehingga tidak akan berfungsi sepanjang waktu.
codingpuss
1
bagaimana cara memperbaikinya? saya pikir saya memerlukan support.app.v4.Fragment one
Dennis Lukas
5
Ini akan mengembalikan FragmentManager yang sesuai. Jika dalam android.support.app.v4.Fragment, itu akan mengembalikan hal yang sama dengan metode getSupportFragmentManager () di Activity. Alasan metode ini disebut cukup getFragmentManager () dalam kasus ini adalah karena tidak ambigius, tidak seperti dalam kasus Activity.
blunden
44

Cukup dapatkan seperti ini -

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.

ATAU

getActivity().getSupportFragmentManager();

dalam metode onActivityCreated () Fragment Anda dan metode apa pun yang dipanggil setelah onActivityCreated ().

Varundroid
sumber
Ini yang saya gunakan, meskipun saya cukup baru dalam pengembangan Android dan saya tidak yakin apakah itu cara yang benar dalam melakukan sesuatu.
Papipo
@codecaster Anda bisa mendapatkan FragmentManager menggunakan metode getFragmentManager () dari Fragment itu sendiri. Saya telah mengedit jawaban saya.
Varundroid
1
Saya punya proyek di sini yang melakukan hal-hal aneh sampai saya menukar getFragmentManager () untuk getActivity.getSupportFragmentManager ().
Papipo
Hmmm aneh. Tidak pernah mengalami masalah seperti ini sejauh ini tetapi tidak ada solusi di atas yang buruk sehingga Anda dapat menggunakan apa pun yang berfungsi untuk Anda.
Varundroid
2
Saya telah melihat jauh ke dalam kelas dari jauh-jauh. Tampaknya ini adalah solusi terbaik yang menggunakan android.support.v4.app.Fragment
DearDhruv
16

Pengguna Kotlin mencoba jawaban ini

(activity as AppCompatActivity).supportFragmentManager
Ranjith Kumar
sumber
3
Untung Anda telah menempatkan ini di sini, kalau tidak itu akan membuat saya gila Ty
MePo
@ GiedriusŠlikas tidak bekerja dalam fragmen atau aktivitas?
Ranjith Kumar
13

jika Anda memiliki masalah ini dan berada di tingkat 21+ api lakukan ini:

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

ini akan mendapatkan peta saat digunakan di dalam sebuah fragmen.

bsautner
sumber
1
Saya mencoba semua perbaikan kode yang disarankan di atas, tetapi tidak dapat membuatnya bekerja. getChildFragmentManager () berhasil! Terima kasih.
John Ward
bagaimana dengan level api di bawah 21? Api level 19 misalnya?
Aliton Oliveira
6

Anda dapat menggunakan getActivity().getSupportFragmentManager()kapan saja Anda ingin mendapatkanSupportFragmentManager.

hierarki adalah Aktivitas -> fragmen. fragmen tidak mampu memanggil getSupportFragmentManger secara langsung tetapi Activity dapat. Dengan demikian, Anda dapat menggunakan getActivity untuk memanggil aktivitas saat ini di mana fragmen berada dan masukgetSupportFragmentManager()

Emil Reña Enriquez
sumber
5

Aktivitas Orangtua saya memperluas AppCompatActivity jadi saya harus memberikan konteks saya ke AppCompatActivity alih-alih hanya Activity.

misalnya.

FragmentAddProduct fragmentAddProduct = FragmentAddProduct.newInstance();
FragmentTransaction fragmentTransaction = ((AppCompatActivity)mcontext).getSupportFragmentManager().beginTransaction();
Akinola Olayinka
sumber
1
((AppCompatActivity) mContext)bagian itu PERSIS apa yang saya cari. Terima kasih!
sHOLE
3

lakukan ini dalam fragmen Anda

getActivity().getSupportFragmentManager()
philip mudenyo
sumber
3

getActivity().getFragmentManager() Ini berhasil atau saya.

Lihat juga di sini.

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

di java kamu bisa ganti dengan

getChildFragmentManager()

di kotlin, buat sederhana dengan

childFragmentManager

semoga membantu :)

Vanya Rachel
sumber
2

Kode berikut berguna untuk saya

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

Anda dapat menggunakan childFragmentManager di dalam Fragmen.

Kishan Solanki
sumber
1

Anda cukup mengakses like

Context mContext;

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

mContext = getActivity();

}

dan kemudian gunakan

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

Beberapa kode Kotlin untuk menggunakan supportFragmentManager di dalam Fragmen.

  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
sumber
0

getSupportFragmentManager() digunakan ketika Anda berada dalam aktivitas dan ingin mendapatkan fragmen tetapi dalam fragmen Anda dapat mengakses

getSupportFragmentManager()

dengan menggunakan metode lain yang disebut getFragmentMangaer()berfungsi sama getSupportFragmentManager()dan Anda dapat menggunakannya seperti dulu:

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

Cara baru yang sederhana untuk melakukannya di kotlin

requireActivity().supportFragmentManager
Reza
sumber
-1

Coba ini:

private SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getActivity().getSupportFragmentManager());
Maddy
sumber
Apa kebutuhan Anda, saya pikir kebutuhan Anda adalah menentukan pager di dalam pager lain dengan bantuan fragmen di dalam fragmen ..! yaitu Anda perlu menggesek tata letak di dalam tata letak swippable?
Maddy
1
alasan @VJ meminta Anda untuk memperluas jawaban Anda adalah karena baris kode bukan jawaban berkualitas baik. Banyak orang selain penanya yang asli akan melihat jawaban Anda dan mungkin ingin menggunakannya untuk menyelesaikan masalah mereka sendiri. Akan sangat membantu bagi para pengguna jika Anda benar-benar menjelaskan apa masalah asli dengan pertanyaan itu, mengapa itu tidak berhasil, dan mengapa solusi Anda berhasil.
psubsee2003