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

编辑:在任何人问之前,formForm 类的一个实例,它扩展了 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

第二次打开 SupportMapFragment 时出错

SupportMapFragment vs MapFragment性能方面

SupportMapFragment 顶部有自定义视图

使用 SupportMapFragment 时,我如何知道地图已准备好使用?