迁移到 AndroidX 后,findFragmentById 为片段返回 null

Posted

技术标签:

【中文标题】迁移到 AndroidX 后,findFragmentById 为片段返回 null【英文标题】:findFragmentById returns null for fragment after migration to AndroidX 【发布时间】:2019-06-29 17:03:07 【问题描述】:

迁移到androidX后,当我尝试获取片段时,findFragmentById(findFragmentByTag也是)开始返回null。

像这样在 XML 中添加片段:

    <fragment
        android:id="@+id/id_fragment"
        android:tag="tag_fragment"
        android:name="com.blaa.MyFragment"
        android:layout_
        android:layout_/>

片段如下所示:

class MyFragment : androidx.fragment.app.Fragment() 
...

而 Activity 看起来像这样:

class MyActivity : AppCompatActivity()
...

依赖:

...
implementation "androidx.appcompat:appcompat:1.0.2"
implementation "androidx.legacy:legacy-support-v4:1.0.0"
implementation "com.google.android.material:material:1.1.0-alpha03"
...

这是我在代码中的调用方式:

supportFragmentManager.findFragmentById(R.id.id_fragment)

supportFragmentManager.findFragmentByTag(R.id.tag_fragment)

两者都返回空值。我也尝试只使用 fragmentManager,结果为空 无论如何它都不会工作,因为它返回简单的片段,而不是 androidx 片段。

感谢您的建议

【问题讨论】:

你更新你的 gradle.properties 了吗? 完成@Ricardo 的评论,您是否已将android.useAndroidX=trueandroid.enableJetifier=true 添加到您的gradle.properties 中? @Wang 你读过这个问题吗?喷射器还有其他用途。 @MartinZeitler 是的,当然,是什么让您怀疑我的评论?我认为这与问题无关。 @Wang 我认为两个 cmets 都错过了实际问题,因为 name 属性显然引用了 androidx.fragment.app.Fragment... 的实例,而 androidx 没有别的,而是重新打包的支持图书馆。命名空间是唯一的区别,而 jetifier 转换第三方库的命名空间。 【参考方案1】:

索引访问,类似fm.getFragments().get(0)fm.getFragments().get(1),可能会起作用。

如果没有......它可能无法找到它,因为它尚未添加(时间问题)。

fm.getFragments() 至少有用,可以查看当前时间点甚至可用的内容。

【讨论】:

我忘了提到这个片段嵌套在另一个片段中,该片段位于活动内部。 “getFragments”只返回了这一个***片段,它的childFragmentManager终于暴露了我的片段。看起来 supportFragmentManager 现在只显示直接孩子。您的回答使我找到了解决方案,所以谢谢:)

以上是关于迁移到 AndroidX 后,findFragmentById 为片段返回 null的主要内容,如果未能解决你的问题,请参考以下文章

迁移到 Androidx 后无法解析符号 R

迁移到 AndroidX 后,RecyclerView 可过滤的 performFiltering() 不起作用

无法解析 android.support.design。迁移到 AndroidX 后

在 Android Studio 中迁移到 AndroidX 后出现 YoutubeAndroidPlayerAPI 错误

Flutter 升级到 v1.14.7-pre.83 并迁移到 AndroidX 后只显示白屏

Androidx 迁移:NoClassDefFoundError