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

Ответы:

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

Varundroid
источник
Это то, чем я пользуюсь, хотя я довольно новичок в разработке под 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();

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

bsautner
источник
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

сделай это в своем фрагменте

getActivity().getSupportFragmentManager()
Филипп Муденьо
источник
3

getActivity().getFragmentManager() Это сработало или у меня.

Также посмотрите на здесь.

Аравинд Гопи
источник
3
((AppCompatActivity) getActivity()).getSupportFragmentManager()
Диако Хасани
источник
3

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

getChildFragmentManager()

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

childFragmentManager

надеюсь, это поможет :)

Ваня Рэйчел
источник
2

Следующий код помогает мне

 SupportMapFragment mapFragment = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map));
    mapFragment.getMapAsync(this);
olajide
источник
2

Вы можете использовать childFragmentManager внутри Fragments.

Кишан Соланки
источник
1

Вы можете просто получить доступ как

Context mContext;

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

mContext = getActivity();

}

а затем использовать

FragmentManager fm = ((FragmentActivity) mContext)
                        .getSupportFragmentManager();
Ashwini.patil
источник
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()

      }
noelmcloughlin
источник
0

getSupportFragmentManager() используется, когда вы находитесь в активности и хотите получить фрагмент, но во фрагменте вы можете получить доступ

getSupportFragmentManager()

с помощью другого метода с именем getFragmentMangaer()работает так же, как getSupportFragmentManager()и вы можете использовать его, как вы использовали для:

fragmentTransaction =getFragmentManager().beginTransaction();
Мохамед Айед
источник
0

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

requireActivity().supportFragmentManager
Реза
источник
-1

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

private SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getActivity().getSupportFragmentManager());
Мэдди
источник
Каково ваше требование, я думаю, что вы должны определить пейджер внутри другого пейджера с помощью фрагментов внутри фрагментов ...! т.е. вам нужно сильно ударить макет внутри изменяемого макета?
Мэдди
1
@VJ попросил вас расширить свой ответ, потому что строка кода не является качественным ответом. Многие люди, помимо первоначального автора вопроса, увидят ваш ответ и могут захотеть использовать его для решения своей проблемы. Этим пользователям было бы полезно, если бы вы на самом деле объяснили, какова была первоначальная проблема с вопросом, почему она не работает и почему ваше решение работает.
psubsee2003