SupportMapFragment 不支持 AndroidX Fragment

SupportMapFragment does not support AndroidX Fragment

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)

我使用的是 play-services-maps 版本 15.0.1 和 AndroidX 库版本 1.0.0-beta01。

我在版本说明中没有发现AndroidX之后SupportMapFragment有任何更新:https://developers.google.com/maps/documentation/android-sdk/releases

编辑:在有人问之前,formForm class 的一个实例,它扩展了 AppCompatActivity(来自 AndroidX)

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

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

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

更新

Google 在 public 问题跟踪器

中提供了以下答案

Hi all,

As noted the Google Maps API is currently based off the support libraries and not AndroidX. Future versions of Google Maps API will certainly support AndroidX, but in the meantime, the following workaround will resolve the issue for you:

  • Use Android Studio 3.2 (currently preview) or higher

  • Ensure your build.gradle contains 'compileSdkVersion 28' (default for new AS 3.2 projects)

  • Include the following in your gradle.properties file (default for new AS 3.2 projects)

    android.useAndroidX=true

    android.enableJetifier=true

Finally, for existing code referencing the support libraries, you can use the "Refactor -> Refactor to AndroidX" tool in Android Studio 3.2+ to automatically convert your code to use the new AndroidX packages.

您需要将 Android 工作室版本更新到 3.2 以上,它仍然是测试版。 问题是 Google Maps 库正在使用支持库中的片段 class,因此它与 androidX 冲突,因此 Android Studio 3.2 版本重构所有依赖项以使用 androidX classes .

我也有这个问题。 这真的不好,而且肯定是暂时的,但这是我让它工作的唯一方法。所以至少它在修复之前解除了我的封锁。

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

它在编译时和运行时都有效。

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

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

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

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

添加最新的google地图播放服务即可解决问题。

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

Google play services latest versions.

要使其正常工作,您必须使用以下版本或更高版本:

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

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

最后,这里是完美的答案:

  1. 添加

    android.enableJetifier=true
    android.useAndroidX=true
    

    到您的 gradle.properties 文件。

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

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

  4. 的导入

现在你可以开始了:-)

我通过在应用的 build.gradle 文件中实施最新版本的播放服务地图解决了这个问题:

implementation 'com.google.android.gms:play-services-maps:17.0.0'

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

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

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