【问题标题】:SupportMapFragment does not support AndroidX FragmentSupportMapFragment 不支持 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 版本,直到他们修复此错误未来版本。

标签: android google-maps android-fragments google-maps-android-api-2 androidx


【解决方案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

    【讨论】:

    【解决方案3】:

    最后,这是完美的答案:

    1. 添加

      android.enableJetifier=true
      android.useAndroidX=true
      

      到你的 gradle.properties 文件。

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

    3. (最重要)您的一些项目导入(在类中使用)将需要替换为等效的 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 类中具有相同的导入。

        【讨论】:

          猜你喜欢
          • 2019-05-15
          • 1970-01-01
          • 1970-01-01
          • 2013-10-03
          • 2020-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多