SupportMapFragment不支持AndroidX Fragment。

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无法转换为扩展android.support.v4.app.Fragment的SupportMapFragment

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

我没有在发行说明中找到任何关于在AndroidX之后更新SupportMapFragment的信息:https://developers.google.com/maps/documentation/android-sdk/releases

编辑:在任何人问之前,form是扩展自AppCompatActivity(来自AndroidX)的Form类的实例。


通过更新gradle到classpath 'com.android.tools.build:gradle:3.2.0'解决了由于implementation 'com.google.android.gms:play-services-maps:16.0.0'引起的类似问题。 - Pavel
1
请注意,它在使用'com.google.android.gms:play-services-maps:16.1.0'时再次失败,因此请继续使用版本16.0.0,直到他们在未来的发布中修复此错误。 - vikir789
11个回答

17

这个问题已经在公共问题跟踪器中向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包。


16

我有和你一样的问题,通过更新build.gradle文件中所有导入的库到最新版本并添加相应依赖解决了问题。

android.enableJetifier=true
android.useAndroidX=true

到gradle.properties文件中

这是我导入的maps包的版本

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

你只需要修复一些导入,然后就完成了。

我希望

编辑:即使编辑了刚才说的内容,您仍然会在Java中看到错误,但是它可以编译和运行而不出错。

编辑2:昨天他们在问题跟踪器上提出了一个解决方法 https://issuetracker.google.com/issues/110573930#comment13


这里提供的解决方案对我有效:https://issuetracker.google.com/issues/110573930#comment36 - Mahmudul Hasan Shohag

6
最后,这里有一个完美的答案:
  1. Add

    android.enableJetifier=true
    android.useAndroidX=true
    

    to your gradle.properties file.

  2. With Android Studio 3.2 or higher, migrate your project to AndroidX by selecting Refactor > Migrate to AndroidX from the menu.

  3. (Most important) Some of your project imports (used in classes) will need to be replaced by equivalent AndroidX libraries. Here you can find libraries and their equivalents. Replace any imports that refer to pre-AndroidX libraries one-by-one.

现在你已准备就绪 :-)

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

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

Google Play服务最新版本。


我认为你没有理解这个问题。16.0.0也是同样的情况。 - clementiano
@clementiano 我有过同样的问题。将版本更改为16.0.0后,问题得到了解决。 - Raj kannan Iyyappan
我最初使用的是16.0.0版本,但仍然存在问题,因此那不可能是解决方案。在gradle.properties中启用jetifier和useAndroidX后,虽然在Android Studio中仍然存在错误,但可以运行,正如@marco-tondini在另一个答案中指出的那样。这应该是被接受的答案。 - clementiano

5

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

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

2

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

请注意,您应该将此解决方案视为临时解决方案,因为现在它与Play Services库的更新无关。如果您也需要尽快迁移到AndroidX,则可以从此处获取:

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


我也尝试过这个,但这确实不是一个好的(如果不是最糟糕的)解决方案。 - pavi2410

2
为了使此功能正常工作,您必须使用以下版本或更高版本:com.google.android.gms:play-services-maps:16.0.0
迁移到AndroidX后,请确保使缓存无效并重新启动以消除Google Maps依赖项上的所有红色错误。

感谢您的回答,我已经寻找了数天的解决方法,“使缓存失效并重启”修复了我的问题,因为当我迁移到AndroidX时,我已经在使用“16.0.0”。 - user2101081

1
你需要将Android Studio版本更新至3.2以上,因为之前的版本仍处于测试阶段。 问题在于Google Maps库使用了来自支持库的Fragment类,与androidX产生了冲突,因此Android Studio 3.2版本会重构所有依赖项以使用androidX类。

我尝试使用Android Studio 3.2和3.3两个版本,但仍然面临着这个问题。 - kattashri

0

我也遇到了这个问题。 这真的不好,而且肯定是暂时的,但这是我能让它工作的唯一方法。所以至少它解决了我的困扰,直到问题得到修复。

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

它在编译时和运行时都能工作。


0
从MapFragment切换到SupportMapFragment时需要记住的一件事是在xml布局中指定该片段实际上是一个SupportMapFragment class="com.google.android.gms.maps.SupportMapFragment":
<fragment
    android:id="@+id/map"
    class="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

然后你可以这样做:

(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);

从您发布的错误消息来看,我怀疑这是您遇到的主要问题。您布局文件中的定义类型为androidx.fragment.Fragment(当您使用findFragmentByTag或findFragmentById时获取的对象类型),但您正在尝试将其转换为com.google.android.gms.maps.SupportMapFragment

更多参考,请参阅SupportMapFragment类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接