SupportMapFragment 不支持 AndroidX Fragment
Posted
技术标签:
【中文标题】SupportMapFragment 不支持 AndroidX Fragment【英文标题】:SupportMapFragment does not support AndroidX Fragment 【发布时间】:2018-12-13 05:40:49 【问题描述】:import com.google.android.gms.maps.SupportMapFragment;
import androidx.fragment.Fragment;
...
private SupportMapFragment mMapFragment;
...
mMapFragment = (SupportMapFragment) form.getSupportFragmentManager().findFragmentByTag(MAP_FRAGMENT_TAG);
这里,IDE 显示 androidx.fragment.Fragment 无法转换为 SupportMapFragment(扩展 android.support.v4.app.Fragment)的错误
我使用的是 15.0.1 版的 play-services-maps 和 1.0.0-beta01 版的 AndroidX 库。
我在发行说明中没有发现 AndroidX 之后 SupportMapFragment 的任何更新:https://developers.google.com/maps/documentation/android-sdk/releases
编辑:在任何人问之前,form
是 Form
类的一个实例,它扩展了 AppCompatActivity
(来自 AndroidX)
【问题讨论】:
implementation 'com.google.android.gms:play-services-maps:16.0.0'
引起的类似问题通过将gradle更新为classpath 'com.android.tools.build:gradle:3.2.0'
解决
小心,'com.google.android.gms:play-services-maps:16.1.0' 再次失败,所以请继续使用 16.0.0 版本,直到他们修复此错误未来版本。
【参考方案1】:
此问题已在公共问题跟踪器中报告给 Google:
https://issuetracker.google.com/issues/110573930
我建议在公共问题跟踪器中为功能请求加注星标,以添加您的投票并订阅来自 Google 的进一步通知。希望 Google 会在 Android Maps SDK 的下一个版本中实现它。
更新
Google 在公共问题跟踪器中提供了以下答案
大家好,
如前所述,Google Maps API 目前基于支持库而不是 AndroidX。未来版本的 Google Maps API 肯定会支持 AndroidX,但与此同时,以下解决方法将为您解决问题:
使用 Android Studio 3.2(当前预览版)或更高版本
确保您的 build.gradle 包含“compileSdkVersion 28”(新 AS 3.2 项目的默认设置)
在您的 gradle.properties 文件中包含以下内容(新 AS 3.2 项目的默认设置)
android.useAndroidX=true
android.enableJetifier=true
最后,对于引用支持库的现有代码,您可以使用 Android Studio 3.2+ 中的“Refactor -> Refactor to AndroidX”工具自动转换您的代码以使用新的 AndroidX 包。
【讨论】:
【参考方案2】:我遇到了同样的问题,通过将所有导入更新到 build.gradle 文件中可用的最后一个版本并添加来解决
android.enableJetifier=true
android.useAndroidX=true
到 gradle.properties
这是我导入的地图包的版本
implementation 'com.google.android.gms:play-services-maps:15.0.1'
你只需要修复一些导入,然后你就完成了
希望
编辑:即使在编辑了我刚才所说的内容之后,您仍然会在 java 中显示错误,但它可以编译并运行而没有错误
EDIT2:昨天他们提出了关于 issuetracker 的解决方法 https://issuetracker.google.com/issues/110573930#comment13
【讨论】:
这里给出的解决方案对我有用:issuetracker.google.com/issues/110573930#comment36【参考方案3】:最后,这是完美的答案:
添加
android.enableJetifier=true
android.useAndroidX=true
到你的 gradle.properties 文件。
对于 Android Studio 3.2 或更高版本,通过从菜单中选择 Refactor > Migrate to AndroidX 将您的项目迁移到 AndroidX。
(最重要)您的一些项目导入(在类中使用)将需要替换为等效的 AndroidX 库。 Here 你可以找到库和它们的等价物。一个接一个地替换所有引用 pre-AndroidX 库的导入。
现在你可以走了:-)
【讨论】:
【参考方案4】:添加最新的谷歌地图播放服务即可解决问题。
实现'com.google.android.gms:play-services-maps:16.0.0'
Google play services latest versions.
【讨论】:
我认为您没有理解这个问题。 16.0.0也是同样的情况 @clementiano 我愿意。我有类似的问题。然后将版本更改为 16.0.0 即可解决问题。 我从 16.0.0 开始,遇到了这个问题,所以这永远无法解决。在 gradle.properties 中启用 jetifier 和 useAndroidX 后,Android Studio 中仍然存在错误,但它会运行,正如@marco-tondini 在另一个答案中指出的那样。那应该是公认的答案【参考方案5】:我通过在我应用的 build.gradle
文件中实现最新版本的 play-services-maps 解决了这个问题:
implementation 'com.google.android.gms:play-services-maps:17.0.0'
【讨论】:
像魅力一样工作!【参考方案6】:为此,您必须使用以下版本或更高版本:
com.google.android.gms:play-services-maps:16.0.0
迁移到 AndroidX 后,请务必使缓存失效并重新启动,以消除 Google 地图依赖项上的所有红色错误。
【讨论】:
感谢您的回答,我一直在寻找解决方案,invalidate caches and restart
解决了我的问题,因为我在迁移到 AndroidX 时已经在使用16.0.0
。【参考方案7】:
不幸的是,Android Jetifier 对我不起作用。我通过将SupportMapFragment
复制到我的项目并更改父项来解决了这个问题。在此过程中,我还必须复制名为 zzak
的类(将其重命名为 SupportMapCallback
)。
请注意,您现在应该将此解决方案视为临时原因,它独立于 Play Services 库的更新。如果您还需要尽快迁移到 AndroidX,请随时从这里获取:
https://gist.github.com/mroczis/3988e390a8b04fad3c8714181718cd60
【讨论】:
我也试过这个,但这确实不是一个好的(如果不是最坏的)解决方案。【参考方案8】:您需要将 Android Studio 版本更新到 3.2 以上,它仍然是测试版。 问题是谷歌地图库正在使用支持库中的 Fragment 类,因此它与 androidX 冲突,因此 Android Studio 3.2 版本重构所有依赖项以使用 androidX 类。
【讨论】:
我尝试使用 Android Studio 3.2 和 3.3 两个版本,但仍然遇到问题。【参考方案9】:我也有这个问题。 这真的不是很好,而且肯定是暂时的,但这是我让它工作的唯一方法。所以至少它在修复之前解除了对我的阻止。
final Object mf = getChildFragmentManager().findFragmentById(R.id.map);
if (mf instanceof SupportMapFragment)
final SupportMapFragment smf = (SupportMapFragment) mf;
// ...
else
//handle
它适用于编译器时间和运行时。
【讨论】:
【参考方案10】:确保在您导入 androidx.fragment.app.Fragment;
的片段 java 类中以及在引用此特定片段的 java 类中,您还以相同的方式导入 Fragment,即import androidx.fragment.app.Fragment;
之后要获取我们创建的片段的引用,请使用getSupportFragmentManager().findFrgmentById(R.id.fragment_id)
。
总而言之,请确保您在所有相关的 Java 或 Kotlin 类中具有相同的导入。
【讨论】:
以上是关于SupportMapFragment 不支持 AndroidX Fragment的主要内容,如果未能解决你的问题,请参考以下文章
在CoordinatorLayout中,Supportmapfragment不工作。
用于在 Scrollview 中移动 Google 地图的 Android SupportMapFragment