Як я можу отримати доступ до 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.