SupportMapFragment не поддерживает 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)

Я использую версию 15.0.1 из игровых сервисов-карт и версию 1.0.0-beta01 из AndroidX-библиотек.

Я не нашел никаких обновлений для SupportMapFragment после AndroidX в примечаниях к выпуску: https://developers.google.com/maps/documentation/android-sdk/releases

Изменение: перед тем, как кто-либо спросит, form представляет собой экземпляр класса Form который расширяет AppCompatActivity (из AndroidX)

Ответ 1

Эта проблема уже была сообщена Google в трекере общедоступных проблем:

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

Я бы предложил добавить запрос на добавление функции в общедоступный трекер, чтобы добавить свой голос и подписаться на дальнейшие уведомления от Google. Надеемся, что Google внедрит его в следующих версиях Android Maps SDK.

Обновить

Google предоставил следующий ответ в трекере общественных вопросов

Всем привет,

Как уже отмечалось, API Карт Google в настоящее время базируется на библиотеках поддержки, а не на AndroidX. Будущие версии API Карт Google, безусловно, будут поддерживать AndroidX, но в то же время следующий обходной путь решит эту проблему для вас:

  • Используйте Android Studio 3.2 (предварительный просмотр) или выше
  • Убедитесь, что ваш build.gradle содержит 'compileSdkVersion 28' (по умолчанию для новых проектов AS 3.2)
  • Включите в файл gradle.properties следующее (по умолчанию для новых проектов AS 3.2)

    android.useAndroidX = верно

    android.enableJetifier = верно

Наконец, для существующего кода, ссылающегося на библиотеки поддержки, вы можете использовать инструмент "Refactor → Refactor to AndroidX" в Android Studio 3. 2+ для автоматического преобразования вашего кода в новые пакеты AndroidX.

Ответ 2

У меня была та же проблема, исправленная путем обновления всех импортов до последней версии, доступной в файле build.gradle, и добавления

android.enableJetifier=true
android.useAndroidX=true

К граде. Свойства

это версия пакета карт, который я импортировал

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

Вы просто должны исправить некоторые импорта, и тогда вы закончите

я надеюсь

РЕДАКТИРОВАТЬ: даже после редактирования того, что я только что сказал, вы все равно будете иметь ошибку, показанную в Java, но она компилируется и работает без ошибок

РЕДАКТИРОВАТЬ 2: вчера они предложили обходной путь на трекере выпускает https://issuetracker.google.com/issues/110573930#comment13

Ответ 4

Наконец, вот идеальный ответ

1 добавлять

android.enableJetifier=true
android.useAndroidX=true

К граде. Свойства

2 С Android Studio 3.2 выше перенесите ваш проект в AndroidX, выбрав Refactor> Migrate to AndroidX в строке меню.

3 (Самое важное) Некоторые импорты вашего проекта (используемые в классах) должны быть заменены эквивалентными библиотеками AndroidX. Здесь вы можете найти библиотеки и их эквиваленты. Просто замените их. Готово, вы готовы идти :-)

Ответ 5

Android Jetifier, к сожалению, не работает для меня. Я решил эту проблему, скопировав SupportMapFragment в мой проект и изменив родителя. Во время этой процедуры я также должен был сделать копию класса с именем zzak (переименовал его в SupportMapCallback).

Обратите внимание, что вы должны принять это решение как временную причину, прямо сейчас оно не зависит от обновлений библиотеки Play Services. Если вам также необходимо как можно скорее перейти на AndroidX, скачайте его отсюда:

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

Ответ 6

Для этого вы должны быть в следующей версии или выше:

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

После перехода на AndroidX обязательно отмените кеши и перезапустите, чтобы избавиться от всех красных ошибок в зависимостях Google Maps.

Ответ 7

Вам нужно обновить версию студии Android до более чем 3.2, это все еще бета-версия. Проблема заключается в том, что в библиотеке Google Maps используется класс Fragment из библиотеки поддержки, поэтому он конфликтует с androidX, поэтому версия Android Studio 3.2 делает рефакторинг всех зависимостей для использования классов androidX.

Ответ 8

Я только что реализовал последнюю версию play-services-maps в модуле приложения класса, как показано ниже:

**

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

**

Ответ 9

У меня тоже была эта проблема. Это действительно не приятно и, конечно, временное, но это был единственный способ заставить его работать. Поэтому, по крайней мере, он разблокировал меня, пока он не будет исправлен.

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

Он работает как время компилятора, так и время выполнения.

Ответ 10

Будьте внимательны, снова произойдет сбой с 'com.google.android.gms: play-services-maps: 16.1.0', поэтому оставайтесь подключенными к версии 16.0.0, пока они не исправят эту ошибку в будущих выпусках.