使用androidx.fragment.app.FragmentContainerView时出现ClassNotFoundException

16

我正在尝试从使用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_height="match_parent"
android:layout_width="match_parent"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="@layout/app_bar_main">

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragment_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

我需要在build.gradle中添加什么内容吗?为什么找不到这个类?


4
如果这种情况只在发布版本中发生,那么这是一个 ProGuard 问题。请检查此快速修复方法:https://dev59.com/b1UL5IYBdhLWcg3waXcr#61365688 - Salam El-Banna
4个回答

35

这在androidx.fragment 1.2.0或更高版本中:

implementation "androidx.fragment:fragment:1.2.0"

1
谢谢!我明白我需要这样的语句,只是找不到任何关于如何格式化它的文档。 - Randy
1
一样。真遗憾我不得不通过谷歌才找到这个。 - wsgeorge
1
对于 Kotlin,实现代码如下:implementation 'androidx.fragment:fragment-ktx:1.4.0'。 - void pointer

8

感谢@Salam El-Banna和他的链接,我发现在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

0

确保没有像这样的自定义构造函数。
例如:

FragmentName (val ctx: Context): Fragment() {

改为

FragmentName: Fragment() {

原因是当充气器充气FrgmentContainer时,它调用默认构造函数来初始化片段。如果没有可用的默认构造函数,它将崩溃。

0

如果您正在使用 Kotlin,则最新的 FragmentContainerView 实现如下:

implementation("androidx.fragment:fragment-ktx:1.3.6")

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