SupportMapFragment不支持AndroidX Fragment

时间:2018-07-04 18:43:54

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

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版本。

我在发行说明https://developers.google.com/maps/documentation/android-sdk/releases

中未找到对AndroidMap之后的SupportMapFragment的任何更新。

编辑:在任何人问之前,formForm类的实例,该类扩展了AppCompatActivity(来自AndroidX)

11 个答案:

答案 0 :(得分:11)

此问题已通过公共问题跟踪器报告给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+中的“重构->重构为AndroidX”工具来自动将代码转换为使用新的AndroidX软件包。

答案 1 :(得分:9)

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

答案 2 :(得分:3)

添加最新的Google Map Play服务,即可解决问题。

  

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

Google play services latest versions.

答案 3 :(得分:3)

我刚刚在成绩应用模块上实现了最新版本的play-services-maps,如下所示:

**

  

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

**

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:2)

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

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

迁移到AndroidX后,请确保使缓存无效并重新启动以摆脱Google Maps依赖项上的所有红色错误。

答案 6 :(得分:2)

最后,这是一个完美的答案

1 。 添加

android.enableJetifier=true
android.useAndroidX=true

到gradle.properties

2 。 使用Android Studio 3.2或更高版本,将您的项目迁移到AndroidX,然后从菜单栏中选择 Refactor>迁移到AndroidX

3 。 (最重要的) 您的某些项目导入(在类中使用)将需要由等效的AndroidX库替换。 Here您可以找到库及其等效项。只需替换它们即可。 完成,您很好:-)

答案 7 :(得分:1)

您需要将Android Studio版本更新至3.2以上,但仍为测试版。 问题是Google Maps库正在使用支持库中的Fragment类,因此它与androidX冲突,因此Android Studio 3.2版本可以重构所有依赖项以使用androidX类。

答案 8 :(得分:0)

我也遇到了这个问题。 确实不是很好,而且肯定是临时的,但这是我可以使它起作用的唯一方法。所以至少它使我畅通无阻,直到问题解决为止。

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

它既可以在编译时运行,也可以在运行时运行。

答案 9 :(得分:0)

请注意,它再次失败,出现“ com.google.android.gms:play-services-maps:16.1.0”,因此请始终附加到版本16.0.0,直到他们在以后的版本中修复此错误为止。

答案 10 :(得分:0)

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

导入Fragment)。

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

总结一下,请确保所有相关的Java或Kotlin类中的导入都相同。