如何在片段中访问 getSupportFragmentManager()?

Posted

技术标签:

【中文标题】如何在片段中访问 getSupportFragmentManager()?【英文标题】:How can I access getSupportFragmentManager() in a fragment? 【发布时间】:2013-12-12 19:16:56 【问题描述】:

我有一个 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);

【问题讨论】:

【参考方案1】:

可以直接调用

getParentFragmentManager()  

获取片段管理器。请注意,getFragmentManager() 也可以使用,但已被标记为已弃用。

【讨论】:

当我第一次点击它工作但之后再次进入其他片段时我点击它显示空白页.. 这是一个开销。请参阅下面的答案... getFragmentManager() 确实是您所需要的。 这里不需要全局 mContext 变量,只需在代码中需要它的任何地方使用 getActivity() 即可。请编辑您的答案,以免误导人们走错方向。 @Varundroid。我同意我们可以随时调用 getFragmentManager() 的事实。如果您可以将您的电子邮件 ID 发送给我,我可以向您发送示例代码以证明 getActivity() 有机会返回 null。 @androidplusios.design 您需要在片段中调用 getFragmentManager() 而不是 getSupportFragementManager。 getFragmentManager() 是 Fragment 类的实例函数,因此您可以在 Fragment 内部调用它,它将获取包含 Fragment 类的当前实例引用。【参考方案2】:

你需要做的就是使用

getFragmentManager()

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

Fragment Documentation

【讨论】:

这应该是公认的答案,不建议按照第一个答案的建议保留对父活动的引用。 @Mark 这是一个完美的答案,应该是公认的答案。 这将返回 android.app.Fragment。在某些情况下,您需要 android.support.app.v4.Fragment 所以它不会一直工作。 如何解决这个问题?我想我需要 support.app.v4.Fragment one 这将返回适当的 FragmentManager。如果在 android.support.app.v4.Fragment 中,它将返回与 Activity 中的 getSupportFragmentManager() 方法相同的内容。在这种情况下,该方法被简单地调用 getFragmentManager() 的原因是因为它不是模棱两可的,不像在 Activity 的情况下。【参考方案3】:

就这样搞定-

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

在您的 Fragment 的 onActivityCreated() 方法以及在 onActivityCreated() 之后调用的任何方法中。

【讨论】:

这是我使用的,虽然我对 Android 开发很陌生,我不确定这是否是正确的做事方式。 @codecaster 您也可以使用 Fragment 本身的 getFragmentManager() 方法获取 FragmentManager。我已经编辑了我的答案。 我有一个项目在这里做了一些奇怪的事情,直到我将 getFragmentManager() 换成 getActivity.getSupportFragmentManager()。 嗯,奇怪。到目前为止从未遇到过这样的问题,但上述解决方案都不是坏的,所以你可以使用任何适合你的方法。 我已经从各个方面深入研究了这些课程。似乎这是使用 android.support.v4.app.Fragment 的最佳解决方案【参考方案4】:

Kotlin 用户试试这个答案

(activity as AppCompatActivity).supportFragmentManager

【讨论】:

幸好你把这个放在这里,否则它会让我发疯的 Ty @GiedriusŠlikas 不在片段或活动中工作?【参考方案5】:

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

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

这将在片段内部使用时获取地图。

【讨论】:

我尝试了上面所有建议的代码修复,但无法让它们中的任何一个工作。 getChildFragmentManager() 成功了!谢谢。 21以下的api级别怎么样?例如 API 级别 19?【参考方案6】:

在 kotlin 中的简单新方法

requireActivity().supportFragmentManager

【讨论】:

【参考方案7】:

在java中你可以替换为

getChildFragmentManager()

在 kotlin 中,通过

使其变得简单
childFragmentManager

希望对你有帮助:)

【讨论】:

【参考方案8】:

getFragmentManager() 已被弃用,取而代之的是 getParentFragmentManager(),以表明您希望访问父片段的片段管理器而不是任何子片段。

只需在 Java 中使用 getParentFragmentManager() 或在 Kotlin 中使用 parentFragmentManager

【讨论】:

【参考方案9】:

我的父 Activity 扩展了 AppCompatActivity,因此我必须将上下文转换为 AppCompatActivity 而不仅仅是 Activity。

例如。

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

【讨论】:

((AppCompatActivity) mContext) 部分是我正在寻找的完全。谢谢!【参考方案10】:

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

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

【讨论】:

【参考方案11】:
((AppCompatActivity) getActivity()).getSupportFragmentManager()

【讨论】:

【参考方案12】:

在您的片段中执行此操作

getActivity().getSupportFragmentManager()

【讨论】:

【参考方案13】:

getActivity().getFragmentManager()这对我有用。

也可以看看here.

【讨论】:

【参考方案14】:

下面的代码对我有用

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

【讨论】:

【参考方案15】:

您可以在 Fragments 中使用 childFragmentManager。

【讨论】:

【参考方案16】:

你可以简单地访问

Context mContext;

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

mContext = getActivity();


然后使用

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

【讨论】:

【参考方案17】:

在 Fragment 中使用 supportFragmentManager 的一些 Kotlin 代码。

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

      

【讨论】:

【参考方案18】:

试试这个:

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

【讨论】:

您的要求是什么,我认为您的要求是在片段中的片段的帮助下在另一个寻呼机中定义一个寻呼机..!即您需要在可滑动布局内滑动布局? 原因@V.J.要求您扩展答案是因为一行代码不是一个高质量的答案。除了问题的原始提问者之外,许多人会看到您的答案,并可能想用它来解决他们自己的问题。如果您确实解释了问题的原始问题、为什么它不起作用以及为什么您的解决方案起作用,这将对这些用户有所帮助。【参考方案19】:

getSupportFragmentManager()当你处于活动状态并想要获取片段但在片段中你可以访问时使用

getSupportFragmentManager()

通过使用另一种称为getFragmentMangaer() 的方法,其工作原理与getSupportFragmentManager() 相同,您可以像以前一样使用它:

fragmentTransaction =getFragmentManager().beginTransaction();

【讨论】:

【参考方案20】:

在片段中获取 fragmentManager 的最佳方法是调用新方法

getParentFragmentManager()

或在 kotlin 文件中使用属性访问语法

parentFragmentManager

这指定要加载的片段管理器(在子片段和父片段之间选择)

【讨论】:

以上是关于如何在片段中访问 getSupportFragmentManager()?的主要内容,如果未能解决你的问题,请参考以下文章

如何在片段中访问 getSupportFragmentManager()?

如何在另一个片段中访问和使用一个片段的按钮?

如何访问活动内部/从活动中的片段视图组件

如何在片段中访问 SQLite 数据到 ListView

如何从另一个片段访问片段对象

从意图活动访问片段方法