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

时间:2013-11-27 08:44:48

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

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

19 个答案:

答案 0 :(得分:226)

您可以直接致电

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

你已经完成了。

答案 1 :(得分:77)

您需要做的就是使用

getFragmentManager()
片段上的

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

Fragment Documentation

答案 2 :(得分:38)

简直就是这样 -

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()之后调用的任何方法。

答案 3 :(得分:12)

Kotlin用户尝试这个答案

(activity as AppCompatActivity).supportFragmentManager

答案 4 :(得分:8)

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

def pageDownload(webPage):
    # Downloads the page

    while not url.endswith('appendixc'):
        print('Downloading page %s...' % url)
        res = requests.get(url)
        res.raise_for_status()

        soup = bs4.BeautifulSoup(res.text)

        return soup

def getProjects(downloadedPage):
    # gets the projects contents

    soup = downloadedPage
    book =  soup.find_all('div', {'class': "book", 'title' : 'Practice Projects'})
    print(book)

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

答案 5 :(得分:6)

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

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

答案 6 :(得分:6)

在Java中,您可以替换为

getChildFragmentManager()

在Kotlin中,简化操作

childFragmentManager

希望有帮助:)

答案 7 :(得分:4)

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

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

答案 8 :(得分:4)

My Parent Activity扩展了AppCompatActivity,所以我不得不将我的上下文转换为AppCompatActivity而不仅仅是Activity。

例如

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

答案 9 :(得分:3)

在您的片段中执行此操作

getActivity().getSupportFragmentManager()

答案 10 :(得分:3)

在Kotlin中完成此操作的简单新方法

requireActivity().supportFragmentManager

答案 11 :(得分:2)

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

另请查看here.

答案 12 :(得分:1)

您只需访问

即可
Context mContext;

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

mContext = getActivity();

}

然后使用

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

答案 13 :(得分:1)

以下代码为我提供了诀窍

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

答案 14 :(得分: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()

      }

答案 15 :(得分:0)

当你在活动中并且想要获得片段时使用

getSupportFragmentManager()但是在片段中你可以访问

getSupportFragmentManager()

使用另一种名为getFragmentMangaer()的方法与getSupportFragmentManager()的工作方式相同,您可以像以前一样使用它:

fragmentTransaction =getFragmentManager().beginTransaction();

答案 16 :(得分:0)

((AppCompatActivity) getActivity()).getSupportFragmentManager()

答案 17 :(得分:0)

您可以在片段内使用childFragmentManager。

答案 18 :(得分:-1)

试试这个:

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