迁移到 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=true
和android.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 后,RecyclerView 可过滤的 performFiltering() 不起作用
无法解析 android.support.design。迁移到 AndroidX 后
在 Android Studio 中迁移到 AndroidX 后出现 YoutubeAndroidPlayerAPI 错误