由于Android的getFragmentManager() API已被弃用,是否有替代方法?

95

FragmentManager已被弃用。是否有替代方法或我现在应该怎么做?

 PlaceAutocompleteFragment autocompleteFragment = (PlaceAutocompleteFragment) getFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);
        autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
            @Override
            public void onPlaceSelected(Place place) {
                // TODO: Get info about the selected place.
                destination = place.getName().toString();
                destinationLatLng = place.getLatLng();
            }
            @Override
            public void onError(Status status) {
                // TODO: Handle the error.
            }
        });

被弃用的罢工图像


3
欢迎来到Stackoverflow。请查看此处以了解如何提问:https://stackoverflow.com/help/how-to-ask - Vikasdeep Singh
2
请阅读在什么情况下我可以在我的问题中添加“紧急”或其他类似短语,以便获得更快的答案? - 总结是这不是一个理想的方式来处理志愿者,并且可能会适得其反,导致无法获得答案。请不要在您的问题中添加此内容。 - halfer
1
@VicJordan:请不要在标题中添加“自制标签”;我们在这里不鼓励这样做,因为我们有一个适当的标记系统。自然和语法正确的句子更好,可以是陈述句或疑问句。这里是规范讨论。(请对您自己的问题标题也遵循此建议,谢谢!)。 - halfer
只需使用:getParentFragmentManager() - TexD
14个回答

56

该方法已在API级别28中被弃用。

请使用FragmentActivity.getSupportFragmentManager()


10
我认为这个答案已经过时了 - 现在只需使用 getSupportFragmentManager() 即可。 - kc_dev
2
@kc_dev 在AndroidX的Fragment中没有getSupportFragmentManager()。弃用消息显示您必须使用getParentFragmentManager()。自从引入片段以来,片段管理器在Android中几乎是最大的垃圾。 :) - The incredible Jan

53
如果我理解得正确的话,getFragmentManager()现在已经被弃用了。
我们将使用getChildFragmentManager(),这将返回一个私有的FragmentManager,用于放置和管理此Fragment中的Fragments。
我们将使用getParentFragmentManager(),这将返回与此Fragment关联的Activity的FragmentManager,用于与该Activity中的Fragments交互。
因此,如果你在Fragment内部处理Fragments,你将使用第一个方法,如果你在Activity中处理Fragments,你将使用第二个方法。
你可以在这里找到它们:package androidx.fragment.app;

https://developer.android.com/reference/androidx/fragment/app/Fragment#getFragmentManager() - Hafez Divandari
请参考以下链接以引入该软件包:https://developer.android.com/jetpack/androidx/releases/fragment#declaring_dependencies - mr5
1
+1. 我测试了在另一个片段内弹出的片段弹出窗口(即在另一个片段内的底部表单片段),使用getChildFragmentManager()getParentFragmentManager()两种方法,但两者都能正常工作而没有任何错误!你知道原因吗? - C.F.G

23

如果您正在使用 AndroidX Fragment androidx.fragment.app.Fragment,您可以使用以下方法:

getActivity().getSupportFragmentManager()

现在你应该使用 requireActivity()。 - The incredible Jan

14

现在,在 Kotlin 中我使用

val fragmentManager = this@className.parentFragmentManager

或者(更喜欢这个)

val fragmentManager = this@className.childFragmentManager

如果你仍然使用Java,我认为代码是

FragmentManager manager = this.getParentFragmentManager();

希望我的答案能解决这个任务。

我建议您现在使用导航。


12
我使用了parentFragmentManager代替fragmentManager。 (如果您正在使用androidxFragment。)

https://developer.android.com/jetpack/androidx/releases/fragment#1.2.0

getFragmentManager()已弃用: Fragment上的getFragmentManager()requireFragmentManager()方法已被弃用并替换为单个getParentFragmentManager()方法, 返回添加到该Fragment的非空FragmentManager(您可以使用isAdded()来确定是否可以安全调用)。


10

由于问题比较广泛,以下是适用于已迁移到 androidX 的解决方案。

确保您的片段在 import 部分中使用 androidX 版本。例如,如果您使用 DialogFragment(),请进行替换。

import android.app.DialogFragment

with

import androidx.fragment.app.DialogFragment

对于fragmentManager,当从另一个fragment启动对话框时,请保持不变;但如果从一个Activity传递,请首先将该活动扩展自FragmentActivity(),然后传递supportFragmentManager

// kotlin
import androidx.fragment.app.FragmentActivity

class MyActivity: FragmentActivity() {
    ...
    val myDialog = MyDialog()
    myDialog.show(supportFragmentManager, TAG)
    ...
}

虽然,如果您还没有迁移到androidX,相同的步骤也适用于support.v4。只需在第一步中替换即可。
import android.app.DialogFragment

使用

import android.support.v4.app.Fragment

1
只是一点提示,AppCompatActivity 扩展了 FragmentActivity,所以你也可以使用它。 - nasch

8

5

Kotlin相关:

activity
    ?.supportFragmentManager
    ?. <whatever needs to come after that>

4

使用支持库来解决这个问题。

根据文档,Fragment类已被弃用:

此类在API级别28中已弃用。使用支持库Fragment可实现所有设备上的一致行为并访问生命周期。


4

使用此功能

import android.support.v4.app.FragmentManager;

与其

import android.app.FragmentManager;

使用这个

FragmentManager manager = ((YourActivity) mContext).getSupportFragmentManager();

不需要使用

 FragmentManager manager = ((YourActivity) mContext).getFragmentManager();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接