将 <fragment> 标签替换为 FragmentContainerView

Posted

技术标签:

【中文标题】将 <fragment> 标签替换为 FragmentContainerView【英文标题】:Replace the <fragment> tag with FragmentContainerView 【发布时间】:2021-01-18 01:48:03 【问题描述】:

android Studio 提供替换 Google Maps 片段中的 &lt;fragment&gt; 标记。在我没有Navigation 的应用程序中,但可能会添加。我应该用&lt;FragmentContainerView&gt; 替换&lt;fragment&gt; 标签吗?

查看https://proandroiddev.com/android-fragments-fragmentcontainerview-292f393f9ccf发现我们也可以用&lt;androidx.fragment.app.FragmentContainerView&gt;替换&lt;FrameLayout&gt;。我们应该这样做吗?

【问题讨论】:

【参考方案1】:

Answer on the benefit of using <FragmentContainerView

【讨论】:

谢谢!看着developer.android.com/reference/androidx/fragment/app/…,我明白了,我们应该在活动中替换&lt;FrameLayout&gt;,而不是在片段中。【参考方案2】:

感谢SABANTO 我用&lt;androidx.fragment.app.FragmentContainerView&gt; 替换了&lt;fragment&gt;&lt;FrameLayout&gt;(仅在活动中替换了&lt;FrameLayout&gt;)。它可以在 debug 构建中正常工作,但不能在崩溃的 release 中工作。

android.view.InflateException: Binary XML file line #16 in com.example:layout/fragment_show_map: Binary XML file line #16 in com.example:layout/fragment_show_map: Error inflating class androidx.fragment.app.FragmentContainerView
Caused by: android.view.InflateException: Binary XML file line #16 in com.example:layout/fragment_show_map: Error inflating class androidx.fragment.app.FragmentContainerView
Caused by: androidx.fragment.app.FragmentActivity$HostCallbacks: Unable to instantiate fragment com.google.android.gms.maps.SupportMapFragment: make sure class name exists
Caused by: java.lang.ClassNotFoundException: com.google.android.gms.maps.SupportMapFragment

查看ClassNotFoundException when using androidx.fragment.app.FragmentContainerView 和https://***.com/a/61365688/2914140 我发现我们应该在proguard-rules.pro 中添加一两行,具体取决于您在XML 文件中的内容:

<androidx.fragment.app.FragmentContainerView
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    ...

proguard-rules.pro:

#-------------------------------------------------
# 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.FragmentActivity$HostCallbacks: 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

不要忘记在 release build 中测试您的应用程序(当然还有在 debug build 中)。

【讨论】:

以上是关于将 <fragment> 标签替换为 FragmentContainerView的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式将 asterix * 替换为 html <em> 标签

根据子弹级别将li标签替换为不同的标签

vue3中的fragment(片段)组件

javascript 正则替换IMG标签

UBB 代码 [textarea] - 不要在标签 [textarea][/textarea] 中将 \n 替换为 <br>

thymeleaf引入公共页面的某个片段