【问题标题】:How can I access getSupportFragmentManager() in a fragment?如何在片段中访问 getSupportFragmentManager()?
【发布时间】: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);

【问题讨论】:

    标签: android android-fragments android-support-library android-fragmentactivity fragmentmanager


    【解决方案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
    【解决方案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
                            

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

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 2022-11-24
                              • 2015-12-15
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多