FragmentManager and androidx FragmentManager

35

我正在尝试在使用androidX的应用程序中进行设置。

我的问题是,当我尝试使用PlaceAutocompleteFragment时,由于它是来自android.app.fragment 的片段,而我的父片段是一个androidx片段:androidx.fragment.app.Fragment,因此它使用一个androidx.fragment.app.FragmentManager而不是android.app.FragmentManager

如何在androidX中使用“旧”的片段?


安卓自我贬低社会再次发威。 - Paul McCarthy
3个回答

39
  1. 将以下代码添加到依赖项中: implementation 'androidx.appcompat:appcompat:1.0.2'
  2. 添加:import androidx.fragment.app.FragmentTransaction;
  3. 将您的 Activity 继承类从 Activity 改为 AppCompatActivity
  4. getFragmentManager()改为 getSupportFragmentManager()

这样就可以解决您的问题。


这会在运行时引入此异常:https://issuetracker.google.com/issues/120750246 - Systemsplanet

12
如果您正在使用新的库,请只使用它们,不要将它们组合起来,因为这可能会导致更多的问题。现在针对您的问题,请转到片段并只更改导入表单:
import android.app.fragment

致:

import androidx.fragment.app.Fragment

那应该能解决你的问题。


这并不能解决所有问题。看起来getFragmentManager()没有被移动到androidX类中。因此,没有真正简单的替代方法。有人知道如何替换getFragmentManager()吗? - Rainer Glüge
17
好的,要求将代码中的getFragmentManager()替换为getSupportFragmentManager(),需要让该Activity继承自androidx.fragment.app.FragmentActivity - Rainer Glüge
没错,自从支持库的引入,getFragmentManager()已被替换为getSupportFragmentManager()。这是一个用于使用基于支持的Fragment和Loader API的活动的基类。当使用此类而不是新平台内置的片段和加载器支持时,您必须分别使用getSupportFragmentManager()getSupportLoaderManager()方法来访问这些功能。 - Diego Lovera

4

没有必要直接从Activity中获取FragmentManager,因为Fragment提供了一个替代方法,叫做getParentFragmentManager

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;

来自已弃用的getFragmentManager文档:

 * @deprecated This has been removed in favor of <code>getParentFragmentManager()</code> which
 * throws an {@link IllegalStateException} if the FragmentManager is null. Check if
 * {@link #isAdded()} returns <code>false</code> to determine if the FragmentManager is
 * <code>null</code>.
getParentFragmentManager 替换方法的文档:
 * Return the FragmentManager for interacting with fragments associated
 * with this fragment's activity.  Note that this will available slightly
 * before {@link #getActivity()}, during the time from when the fragment is
 * placed in a {@link FragmentTransaction} until it is committed and
 * attached to its activity.
 *
 * <p>If this Fragment is a child of another Fragment, the FragmentManager
 * returned here will be the parent's {@link #getChildFragmentManager()}.
 *
 * @throws IllegalStateException if not associated with a transaction or host.

请务必检查isAdded以确保FragmentManager不为null。


完美地为我解决了问题,我将 getFragmentManager 替换为 getParentFragmentManager,现在它可以正常工作了,谢谢啊。 - Vikas Kandari
对我没用,它显示“无法解析方法'getParentFragmentManager()'”。 - temirbek
必须使用以下代码: "import androidx.fragment.app.Fragment"。文档。应用程序可能尚未升级到androidx支持库,这是有可能的吗? - Elletlar
你试过这个吗? 下面的问题暗示它不会起作用 https://stackoverflow.com/questions/60848166/cannot-resolve-method-getparentfragmentmanager - Paul McCarthy

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