Как я могу получить доступ к 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;

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

@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 () там, где вам нужно в вашем коде. Пожалуйста, измените свой ответ, чтобы не вводить людей в заблуждение.
— Varundroid

3
@Varundroid. Я согласен с тем фактом, что мы можем вызвать getFragmentManager () в любое время. Если вы можете отправить мне свой идентификатор электронной почты, я могу отправить вам пример кода, чтобы доказать, что есть вероятность, что getActivity () вернет значение NULL.
— Элдхоз М Бабу

1
@ androidplusios.design Вам нужно вызывать getFragmentManager (), а не getSupportFragementManager внутри вашего фрагмента. getFragmentManager () является функцией экземпляра класса Fragment, и поэтому вы можете вызывать ее внутри Fragment, и она будет принимать текущую ссылку на экземпляр класса Fragment.
— Элдхоз М Бабу

83

Все, что вам нужно сделать, это использовать

getFragmentManager()

метод на вашем фрагменте. Он даст вам поддержку менеджера фрагментов, когда вы использовали его при добавлении этого фрагмента.

Фрагмент документации


8
Это должен быть принятый ответ, не рекомендуется сохранять ссылку на родительскую активность, как это предлагается в первом ответе.
— Йоанн Херкуэ

1
@ Отметьте, что это идеальный ответ, и он должен быть принятым.
— Varundroid

3
Это вернет android.app.Fragment. В некоторых случаях вам нужен android.support.app.v4.Fragment, чтобы он не работал постоянно.
— codingpuss

1
как это исправить? я думаю, что мне нужна поддержка.app.v4.Fragment один
— Деннис Лукас

5
Это вернет соответствующий FragmentManager. Если в android.support.app.v4.Fragment он вернет то же, что и метод getSupportFragmentManager () в Activity. Причина, по которой метод вызывается просто getFragmentManager () в этом случае, заключается в том, что он не является двусмысленным, в отличие от случая Activity.
— ослепление

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

в методе onActivityCreated () вашего фрагмента и любом методе, который вызывается после onActivityCreated ().


Это то, чем я пользуюсь, хотя я довольно новичок в разработке под Android и не уверен, что это правильный путь.
— Папипо

@codecaster вы можете получить FragmentManager, используя метод getFragmentManager () самого Fragment. Я отредактировал свой ответ.
— Varundroid

1
У меня есть проект, который делал странные вещи, пока я не поменял местами getFragmentManager () на getActivity.getSupportFragmentManager ().
— Папипо

Хм странно. До сих пор никогда не сталкивался с подобной проблемой, но ни одно из вышеперечисленных решений не является плохим, поэтому вы можете использовать все, что вам подходит.
— Varundroid

2
Я смотрел глубоко в классы со всех сторон. Похоже, это лучшее решение, которое использует android.support.v4.app.Fragment
— DearDhruv

16

Пользователи Kotlin попробуют этот ответ

(activity as AppCompatActivity).supportFragmentManager

3
Хорошо, что вы положили это здесь, иначе это сведет меня с ума Тай
— МеПо

@ GiedriusŠlikas не работает в фрагментах или деятельности?
— Ранджит Кумар

13

если у вас есть эта проблема и вы находитесь на уровне API 21+, сделайте это:

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

это получит карту при использовании внутри фрагмента.


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

как насчет уровня API ниже 21? Api уровень 19 например?
— Алитон Оливейра

6

Вы можете использовать в getActivity().getSupportFragmentManager()любое время, когда хотите getSupportFragmentManager.

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


5

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

например.

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

1
((AppCompatActivity) mContext)часть была ТОЧНО то , что я искал. Спасибо!
— ОБУЧЕНИЕ




3

в Java вы можете заменить на

getChildFragmentManager()

в kotlin, сделайте это простым

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

Некоторый код Kotlin для использования 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

Простой новый способ сделать это в kotlin

requireActivity().supportFragmentManager

-1

Попробуй это:

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

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

1
@VJ попросил вас расширить свой ответ, потому что строка кода не является качественным ответом. Многие люди, помимо первоначального автора вопроса, увидят ваш ответ и могут захотеть использовать его для решения своей проблемы. Этим пользователям было бы полезно, если бы вы на самом деле объяснили, какова была первоначальная проблема с вопросом, почему она не работает и почему ваше решение работает.
— psubsee2003
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.