【问题标题】:FragmentManager and androidx FragmentManagerFragmentManager 和 androidx FragmentManager
【发布时间】:2019-02-14 20:08:19
【问题描述】:

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

我的问题是,当我尝试使用 PlaceAutocompleteFragment 时出现错误,因为它是来自 android.app.fragment 的片段,而我的父片段是 androidx 片段:androidx.fragment.app.Fragment 所以它使用 androidx.fragment.app.FragmentManager 而不是 @987654324 @。

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

【问题讨论】:

    标签: android android-fragments androidx


    【解决方案1】:

    如果您使用的是新库,则只使用这些库,不要将它们组合在一起,因为您可能会遇到更多问题。现在针对您的问题转到您的片段并更改导入表单:

    import android.app.fragment
    

    收件人:

    import androidx.fragment.app.Fragment
    

    这应该可以解决您的问题。

    【讨论】:

    • 这并不能解决所有问题。看来 getFragmentManager() 尚未移至 androidX 类。所以没有真正简单的替代品。有人知道如何替换 getFragmentManager() 吗?
    • OK 所以活动必须从androidx.fragment.app.FragmentActivity 扩展FragmentActivity,然后可以使用getSupportFragmentManager() 而不是getFragmentManager()
    • 没错,自从引入支持库以来,getFragmentManager() 已被 getSupportFragmentManagaer() 取代。 想要使用基于支持的 Fragment 和 Loader API 的活动的基类。当使用此类而不是新平台的内置片段和加载器支持时,您必须分别使用 getSupportFragmentManager() 和 getSupportLoaderManager() 方法来访问这些功能。 Source@RainerGlüge
    【解决方案2】:
    1. 将此添加到依赖项: implementation 'androidx.appcompat:appcompat:1.0.2'
    2. 添加这个:import androidx.fragment.app.FragmentTransaction;
    3. 将您的活动从Activity 切换到AppCompatActivity
    4. getFragmentManager() 更改为getSupportFragmentManager()

    这将解决您的问题。

    【讨论】:

    【解决方案3】:

    没有任何必要直接从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 不为空。

    【讨论】:

    • 完美地为我工作我将 getFragmentManager 替换为 getParentFragmentManager 并且它工作了谢谢人
    • 对我不起作用,它说“无法解析方法'getParentFragmentManager()'”
    • 必须使用“import androidx.fragment.app.Fragment”来完成。 Docs。可能是应用没有升级到androidx支持库?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 2021-04-09
    • 2021-01-07
    相关资源
    最近更新 更多