由于不推荐使用Android getFragmentManager()API,还有其他选择吗?

Zub*_*put 16 java android

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.
            }
        });
Run Code Online (Sandbox Code Playgroud)

弃用警示图像

Min*_*mir 29

如果我理解你getFragmentManager(),现在已弃用

我们将使用getChildFragmentManager() 返回一个私有的 FragmentManager 来放置和管理这个 Fragment 中的 Fragment。

我们将使用getParentFragmentManager() 返回 FragmentManager 与与此片段活动相关联的片段进行交互。

因此,如果您处理片段中的片段,您将使用第一个;如果您处理活动中的片段,您将使用第二个。

你可以在这里找到它们 package androidx.fragment.app;


tet*_*Arg 14

如果您使用 AndroidX 片段androidx.fragment.app.Fragment,则可以使用

getActivity().getSupportFragmentManager()
Run Code Online (Sandbox Code Playgroud)


小智 13

API级别28不推荐使用此方法。

使用 FragmentActivity.getSupportFragmentManager()

  • 我认为这个答案已经过时了 - 现在只是“getSupportFragmentManager()” (11认同)
  • 有时看起来他们改变方法名称只是为了惹恼我们 (7认同)
  • @kc_dev AndroidX的Fragment中没有getSupportFragmentManager()。弃用消息表明您必须使用 getParentFragmentManager()。Fragmentmanagers 几乎是 Android 中自从引入 Fragments 以来最大的垃圾。:) (2认同)

小智 10

我用parentFragmentManager而不是fragmentManager. (如果您使用的是androidx Fragment。)

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

getFragmentManager()折旧:在getFragmentManager()requireFragmentManager()方法上Fragment已被弃用,并用单一的替代getParentFragmentManager()方法,该方法返回非空FragmentManagerFragment加入到(你可以使用isAdded(),以确定它是否是安全的调用)。


mid*_*nhk 9

您应该使用Android支持库中的Fragment类.

android.app.Fragment在API级别28中已弃用.使用支持库片段可在所有设备上实现一致的行为并访问Lifecycle.

请改用android.support.v4.app.Fragment.


SIM*_*SAL 6

由于这个问题有点宽泛,这里是那些已迁移到androidX.

确保您的片段在import部分中使用 androidX 版本。即如果您正在使用DialogFragment(),请更换

import android.app.DialogFragment
Run Code Online (Sandbox Code Playgroud)

import androidx.fragment.app.DialogFragment
Run Code Online (Sandbox Code Playgroud)

然后fragmentManagershow()打开对话框时,如果从另一个启动fragment不要改变它,但如果从一个传递Activity,首先从 扩展活动FragmentActivity(),然后传递supportFragmentManager

// kotlin
import androidx.fragment.app.FragmentActivity

class MyActivity: FragmentActivity() {
    ...
    val myDialog = MyDialog()
    myDialog.show(supportFragmentManager, TAG)
    ...
}
Run Code Online (Sandbox Code Playgroud)

虽然,同样的步骤也适用于support.v4如果您还没有迁移到androidX。只是在第一步替换

import android.app.DialogFragment
Run Code Online (Sandbox Code Playgroud)

import android.support.v4.app.Fragment
Run Code Online (Sandbox Code Playgroud)


Lio*_*ong 6

现在,在 Kotlin 中我使用

val fragmentManager = this@className.parentFragmentManager
Run Code Online (Sandbox Code Playgroud)

好吧,如果您仍然使用 Java,我认为代码是

FragmentManager manager = this.getParentFragmentManager();
Run Code Online (Sandbox Code Playgroud)

希望我的回答可以解决这个任务。

我建议你现在使用导航


And*_*Dev 5

对于科特林:

activity
    ?.supportFragmentManager
    ?. <whatever needs to come after that>
Run Code Online (Sandbox Code Playgroud)


Vik*_*ngh 4

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

根据文档Fragment 类已被弃用:

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