Як я можу отримати доступ до getSupportFragmentManager () у фрагменті?


157

У мене є FragmentActivity, і я хочу використовувати в ньому фрагмент карти. У мене виникають проблеми з отриманням доступу до нього менеджера фрагментів підтримки.

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

Відповіді:


278

Ви можете безпосередньо зателефонувати

getFragmentManager() 

щоб отримати менеджер фрагментів.

або

У вашому фрагменті

Створити поле:

private FragmentActivity myContext;

переопределить ваш фрагмент методом Attach:

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

Коли вам потрібно отримати дзвінок менеджера фрагментів підтримки:

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

або

FragmentManager fragManager = myContext.getFragmentManager();

Ви закінчили.


3
коли я натискаю перший раз, коли це працює, але після цього знову на іншому фрагменті, я натискаю на нього, це показує порожню сторінку ..
— DjP

11
Це накладні витрати. Дивіться мою відповідь нижче ... getFragmentManager () - це все, що вам потрібно.
— Марк

4
Тут вам не потрібна глобальна змінна mContext, просто використовуйте getActivity () там, де вам потрібен код. Відредагуйте свою відповідь, щоб не вводити людей в оману в неправильному напрямку.
— Варундрой

3
@Varundroid. Я погоджуюся з тим, що ми можемо викликати getFragmentManager () у будь-який час. Якщо ви можете надіслати мені свій електронний номер, я можу надіслати зразок коду, щоб довести, що на землі є шанси отримати getActivity () повернути нуль.
— Eldhose M Babu

1
@ androidplusios.design Вам потрібно зателефонувати getFragmentManager (), а не getSupportFragementManager всередині вашого фрагмента. getFragmentManager () - це функція екземпляра класу Fragment, тому ви можете назвати його всередині фрагмента, і він прийме поточну посилання на екземпляр класу Fragment.
— Eldhose M Babu

83

Все, що вам потрібно зробити - це використовувати

getFragmentManager()

метод на вашому фрагменті. Він надасть вам менеджер фрагментів підтримки, коли ви використовували його, додаючи цей фрагмент.

Документація на фрагменти


8
Це має бути прийнята відповідь, не рекомендується зберігати посилання на батьківську діяльність, як це запропоновано першою відповіддю.
— Йоанн Херкует

1
@Марк, це ідеальна відповідь, і це має бути прийнятою відповіддю.
— Варундроїд

3
Це поверне android.app.Fragment. У деяких випадках вам потрібен android.support.app.v4.Fragment, щоб він не працював весь час.
— codingpuss

1
як це виправити? Я думаю, мені потрібна support.app.v4.Fragment one
— Денніс Лукас

5
Це поверне відповідний FragmentManager. Якщо в android.support.app.v4.Fragment, він поверне те саме, що і метод getSupportFragmentManager () в Activity. Причина цього методу називається просто getFragmentManager () у цьому випадку полягає в тому, що він не є амбітним, на відміну від випадку Activity.
— blunden

44

Просто отримайте це так -

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.

АБО

getActivity().getSupportFragmentManager();

у методі onActivityCreate () вашого фрагмента та будь-якому методі, який викликається після onActivityCreate ().


Це те, що я використовую, хоча я зовсім новачок у розробці Android, і я не впевнений, чи правильно це робити.
— Папіпо

@codecaster ви можете отримати FragmentManager, використовуючи метод getFragmentManager () і самого фрагмента. Я відредагував свою відповідь.
— Варундоїд

1
У мене є проект, який робив дивні речі, поки я не поміняв getFragmentManager () на getActivity.getSupportFragmentManager ().
— Папіпо

Хммм дивно. Ніколи не стикався з такою проблемою, як це, але жодне з вищезазначених рішень не є поганим, тому ви можете використовувати все, що працює для вас.
— Варундроїд

2
Я з усієї сторони заглядав глибоко в класи. Здається, це найкраще рішення, яке використовує android.support.v4.app.Fragment
— DearDhruv


13

якщо у вас є ця проблема і ви знаходитесь на рівні api 21+, зробіть це:

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

це отримає карту при використанні всередині фрагмента.


1
Я спробував усі запропоновані вище виправлення коду, але жоден із них не міг працювати. getChildFragmentManager () зробив свою справу! Дякую.
— Джон Уорд

як щодо рівня api нижче 21? Наприклад, рівень Api 19?
— Алітон Олівейра

6

Можна використовувати getActivity().getSupportFragmentManager() будь-який час, щоб отриматиSupportFragmentManager.

ієрархія - активність -> фрагмент. фрагмент не здатний безпосередньо викликати getSupportFragmentManger, але діяльність може. Таким чином, ви можете використовувати getActivity для виклику поточної активності, в якій знаходиться фрагмент, і отриманняgetSupportFragmentManager()


5

Моя батьківська активність розширює AppCompatActivity, тому мені довелося кинути свій контекст на AppCompatActivity, а не просто на Activity.

напр.

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

1
((AppCompatActivity) mContext)частина була ТОЧНО, що я шукав. Дякую!
— sHOLE




3

в Java ви можете замінити

getChildFragmentManager()

в котліні, спростіть його

childFragmentManager

сподіваюся, що це допоможе :)


2

Наступний код робить для мене хитрість

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


1

Ви можете просто отримати доступ до типу

Context mContext;

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

mContext = getActivity();

}

а потім використовувати

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

1

Деякий код Котліна для використання supportFragmentManager всередині фрагмента.

  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() використовується, коли ви перебуваєте в активності та хочете отримати фрагмент, але до фрагменту ви можете отримати доступ

getSupportFragmentManager()

використовуючи інший метод, який називається, getFragmentMangaer()працює так само, як getSupportFragmentManager()і ви можете використовувати його, як раніше:

fragmentTransaction =getFragmentManager().beginTransaction();

0

Новий простий спосіб зробити це в котліні

requireActivity().supportFragmentManager

-1

Спробуйте це:

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

Яка ваша вимога, я думаю, що ваша вимога - визначити пейджер всередині іншого пейджера за допомогою фрагментів всередині фрагментів ..! тобто вам потрібно провести макет всередині макетів, що можна прокласти?
— Мадді

1
причина @VJ попросила вас розширити свою відповідь, тому що рядок коду не є якісною відповіддю. Багато людей, окрім оригінального запитувача, побачать вашу відповідь і, можливо, захочуть використати її для вирішення власної проблеми. Цим користувачам було б корисно, якби ви насправді пояснили, у чому полягає початкова проблема, чому це не працює, і чому ваше рішення працює.
— psubsee2003
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.