使用 androidx.fragment.app.FragmentContainerView 时出现 ClassNotFoundException
Posted
技术标签:
【中文标题】使用 androidx.fragment.app.FragmentContainerView 时出现 ClassNotFoundException【英文标题】:ClassNotFoundException when using androidx.fragment.app.FragmentContainerView 【发布时间】:2020-05-17 10:52:00 【问题描述】:我正在尝试从使用FrameLayout
过渡到使用FragmentContainerView
,从我看过的教程来看,这应该很容易。但是,当我在进行更改后运行我的应用程序时,我得到了
Error inflating class androidx.fragment.app.FragmentContainerView
Caused by: java.lang.ClassNotFoundException: androidx.fragment.app.FragmentContainerView
我的布局文件非常简单:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="@layout/app_bar_main">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_layout"
android:layout_
android:layout_/>
</LinearLayout>
我需要在我的 build.gradle 中添加一些东西吗?为什么找不到类?
【问题讨论】:
如果它只发生在发布版本中,那么它是一个 pro-guard 问题。检查此快速修复:***.com/a/61365688/3484700 【参考方案1】:androidx.fragment
1.2.0 或更高版本:
implementation "androidx.fragment:fragment:1.2.0"
【讨论】:
谢谢!我想我需要这样的声明,只是找不到任何关于如何格式化的文档 相同。很遗憾我不得不用谷歌搜索。 对于 kotlin 实现 'androidx.fragment:fragment-ktx:1.4.0'【参考方案2】:感谢@Salam El-Banna 和他的link,我发现如果应用程序在release
构建中崩溃,我们应该添加proguard-rules.pro
(一两行,取决于<FragmentContainerView>
中的android:name
:
#-------------------------------------------------
# JetPack Navigation
# This fixes:
# Caused by: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment androidx.navigation.fragment.NavHostFragment: make sure class name exists
# Caused by: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.google.android.gms.maps.SupportMapFragment: make sure class name exists
#-------------------------------------------------
-keepnames class androidx.navigation.fragment.NavHostFragment
-keepnames class com.google.android.gms.maps.SupportMapFragment
【讨论】:
【参考方案3】:确保它们不是这样的自定义构造函数。 例如:
FragmentName (val ctx: Context): Fragment()
改为
FragmentName: Fragment()
原因是inflater在对FrgmentContainer进行膨胀时,会调用默认构造函数来初始化片段。如果它们没有可用的默认构造函数,它将崩溃。
【讨论】:
【参考方案4】:如果您使用的是 kotlin,则最新的 FragmentContainerView
实现保留在:
implementation("androidx.fragment:fragment-ktx:1.3.6")
【讨论】:
以上是关于使用 androidx.fragment.app.FragmentContainerView 时出现 ClassNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章
<androidx.fragment.app.FragmentContainerView> 与 <fragment> 作为 NavHost 的视图
如何用 Android 数据绑定替换 androidx.fragment.app.FragmentContainerView 中的片段
在迁移到 viewpager2 androidx 时发现此错误“无法解析方法 'super(androidx.fragment.app.FragmentManager)'”
androidx fragment.app FragmentStatePagerAdapter 已弃用(java)
当 minifyEnabled 为 true 时,膨胀类 androidx.fragment.app.FragmentContainerView 时出错
java.lang.ClassCastException: com.example.yijie.MainData cannot be cast to androidx.fragment.app.Fra