29
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)

4

10 回答 10

17

此问题已在公共问题跟踪器中报告给 Google:

https://issuetracker.google.com/issues/110573930

我建议在公共问题跟踪器中为功能请求加注星标,以添加您的投票并订阅来自 Google 的进一步通知。希望谷歌能在 Android Maps SDK 的下一个版本中实现它。

更新

谷歌在公共问题跟踪器中提供了以下答案

大家好,

如前所述,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 包。

于 2018-07-04T18:59:27.813 回答
16

我遇到了同样的问题,通过将所有导入更新到 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的解决方法

于 2018-09-18T15:29:45.907 回答
6

最后,这是完美的答案:

  1. 添加

    android.enableJetifier=true
    android.useAndroidX=true
    

    到你的 gradle.properties 文件。

  2. 使用 Android Studio 3.2 或更高版本,通过从菜单中选择Refactor > Migrate to AndroidX将您的项目迁移到 AndroidX 。

  3. (最重要)您的一些项目导入(在类中使用)将需要替换为等效的 AndroidX 库。在这里您可以找到库及其等价物。一个接一个地替换任何引用 pre-AndroidX 库的导入。

现在你可以走了:-)

于 2019-07-15T19:18:38.217 回答
5

添加最新的谷歌地图播放服务,这将解决问题。

实施 'com.google.android.gms:play-services-maps:16.0.0'

谷歌播放服务最新版本。

于 2018-10-16T22:59:51.270 回答
5

我通过在我的应用程序build.gradle文件中实现最新版本的 play-services-maps 解决了这个问题:

implementation 'com.google.android.gms:play-services-maps:17.0.0'
于 2019-09-06T19:15:56.837 回答
2

不幸的是,Android Jetifier 对我不起作用。我通过复制SupportMapFragment到我的项目并更改父级解决了这个问题。在此过程中,我还必须复制名为的类zzak(将其重命名为SupportMapCallback)。

请注意,您现在应该将此解决方案视为临时原因,它独立于 Play Services 库的更新。如果您还需要尽快迁移到 AndroidX,请随时从此处获取:

https://gist.github.com/mroczis/3988e390a8b04fad3c8714181718cd60

于 2018-10-11T19:45:27.800 回答
2

为此,您必须使用以下版本或更高版本:

com.google.android.gms:play-services-maps:16.0.0

迁移到 AndroidX 后,请务必使缓存无效并重新启动,以消除 Google 地图依赖项上的所有红色错误。

于 2018-12-06T16:27:22.630 回答
1

您需要将 Android Studio 版本更新到 3.2 以上,它仍然是 beta 版本。问题是谷歌地图库使用支持库中的 Fragment 类,因此它与 androidX 冲突,因此 Android Studio 3.2 版本重构所有依赖项以使用 androidX 类。

于 2018-08-02T14:20:10.220 回答
0

我也有这个问题。这真的不是很好,而且肯定是暂时的,但这是我让它工作的唯一方法。所以至少它解除了对我的阻碍,直到它得到修复。

    final Object mf = getChildFragmentManager().findFragmentById(R.id.map);
    if (mf instanceof SupportMapFragment) {
        final SupportMapFragment smf = (SupportMapFragment) mf;
        // ...
    } else {
        //handle
    }

它适用于编译器时间和运行时。

于 2018-08-22T08:58:13.730 回答
0

确保在您导入的片段 java 类androidx.fragment.app.Fragment;中以及在引用此特定片段的 java 类中,您也以相同的方式导入片段,即import androidx.fragment.app.Fragment;

之后要获取我们创建的片段的引用,请使用getSupportFragmentManager().findFrgmentById(R.id.fragment_id).

总而言之,确保您在所有相关的 Java 或 Kotlin 类中具有相同的导入。

于 2020-01-31T12:56:16.813 回答