将 <fragment> 标签替换为 FragmentContainerView
Posted
技术标签:
【中文标题】将 <fragment> 标签替换为 FragmentContainerView【英文标题】:Replace the <fragment> tag with FragmentContainerView 【发布时间】:2021-01-18 01:48:03 【问题描述】:android Studio 提供替换 Google Maps
片段中的 <fragment>
标记。在我没有Navigation
的应用程序中,但可能会添加。我应该用<FragmentContainerView>
替换<fragment>
标签吗?
查看https://proandroiddev.com/android-fragments-fragmentcontainerview-292f393f9ccf发现我们也可以用<androidx.fragment.app.FragmentContainerView>
替换<FrameLayout>
。我们应该这样做吗?
【问题讨论】:
【参考方案1】:Answer on the benefit of using <FragmentContainerView
【讨论】:
谢谢!看着developer.android.com/reference/androidx/fragment/app/…,我明白了,我们应该在活动中替换<FrameLayout>
,而不是在片段中。【参考方案2】:
感谢SABANTO 我用<androidx.fragment.app.FragmentContainerView>
替换了<fragment>
和<FrameLayout>
(仅在活动中替换了<FrameLayout>
)。它可以在 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> 标签
UBB 代码 [textarea] - 不要在标签 [textarea][/textarea] 中将 \n 替换为 <br>