如何在片段中访问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);

Answers:


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()确实是您所需要的。
2014年

4
您无需在此处使用全局mContext变量,只需在代码中需要的位置使用getActivity()即可。请修改您的答案,以免误导他人。
Varundroid 2014年

3
@Varundroid。我同意我们可以随时调用getFragmentManager()的事实。如果您可以向我发送您的电子邮件ID,那么我可以向您发送示例代码,以证明getActivity()有可能返回null。
Eldhose M Babu 2014年

1
@ androidplusios.design您需要在片段内调用getFragmentManager()而不是getSupportFragementManager。getFragmentManager()是Fragment类的实例函数,因此您可以在Fragment中调用它,它将采用包含Fragment类的当前实例引用。
Eldhose M Babu 2015年

83

您需要做的就是使用

getFragmentManager()

片段上的方法。当您在添加此片段时使用它时,它将为您提供支持片段管理器。

片段文档


8
这应该是可接受的答案,不建议像第一个答案所建议的那样保留对父项活动的引用。
Yoann Hercouet 2014年

1
@Mark这是一个完美的答案,应该是公认的答案。
Varundroid 2014年

3
这将返回android.app.Fragment。在某些情况下,您需要android.support.app.v4.Fragment,因此它不会一直工作。
codingpuss

1
如何解决这个问题?我认为我需要support.app.v4.Fragment一
Dennis Lukas

5
这将返回适当的FragmentManager。如果在android.support.app.v4.Fragment中,它将返回与Activity中的getSupportFragmentManager()方法相同的东西。在这种情况下,将方法简单地称为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开发的新手,但我不确定这是否是正确的做事方式,但这就是我使用的方式。
2015年

@codecaster,您也可以使用Fragment本身的getFragmentManager()方法获取FragmentManager。我已经编辑了答案。
Varundroid

1
在这里,我有一个做得很奇怪的项目,直到我将getFragmentManager()换成getActivity.getSupportFragmentManager()。
2015年

嗯,很奇怪。到目前为止,从未遇到过这样的问题,但是以上解决方案都不错,因此您可以使用任何适合您的方法。
Varundroid

2
我从一开始就对课程进行了深入研究。似乎这是使用android.support.v4.app.Fragment的最佳解决方案
DearDhruv


13

如果您遇到此问题并且在api级别21+上,请执行以下操作:

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

在片段内使用时,将获得地图。


1
我尝试了上面所有建议的代码修复,但都无法使用。getChildFragmentManager()做到了!谢谢。
约翰·沃德

低于21的api级别如何?例如,Api 19级?
阿里顿·奥利维拉

6

您可以getActivity().getSupportFragmentManager()随时使用getSupportFragmentManager。

层次结构是活动->片段。片段不能直接调用getSupportFragmentManger,但活动可以。因此,您可以使用getActivity调用该片段所在的当前活动并获取getSupportFragmentManager()


5

我的父活动扩展了AppCompatActivity,因此我不得不将上下文强制转换为AppCompatActivity,而不仅仅是Activity。

例如。

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

1
((AppCompatActivity) mContext)部分是确切地是我一直在寻找。谢谢!
s17年





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代码在Fragment中使用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());

您的要求是什么,我想您的要求是在片段中的片段的帮助下在另一个传呼器中定义一个传呼器。即您需要在可滑动布局内滑动布局?
Maddy

1
@VJ要求您扩展答案的原因是因为一行代码不是高质量的答案。除了问题的原始提问者以外,还有很多人会看到您的答案,并可能希望使用它来解决自己的问题。如果您实际上解释了该问题的原始问题,为什么不起作用以及您的解决方案起作用了,这对那些用户会有所帮助。
psubsee2003
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.