Фрагмент AndroidX добавить Google Map - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь добавить карту Google во фрагмент AndroidX (androidx.fragment.app.Fragment), используя шаблон MVP, но он не отображается.Но когда я попытался использовать этот код в обычном фрагменте (android.support.v4.app.Fragment) или в Activity, он показывается нормально.

Я пробовал оба способа:

  1. с использованием MapView (который комментируется в коде)

  2. с использованием SupportMapFragment (который не поддерживается в AndroidX ref здесь )

Вот код, который я пробовал:

import android.os.Bundle
import com.google.android.gms.maps.*
import com.google.android.gms.maps.model.LatLng
import com.test.App
import com.test.R
import com.test.ui.base.BaseFragment
import javax.inject.Inject
import com.google.android.gms.maps.model.MarkerOptions
import com.google.android.gms.maps.SupportMapFragment

class OverviewMapFragment : BaseFragment<OverviewMapContract.View, OverviewMapContract.Presenter>(), OverviewMapContract.View, OnMapReadyCallback {
 private var map: GoogleMap? = null
//    private var mapView: MapView? = null

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
        mapFragment.getMapAsync(this)

//        mapView = view!!.findViewById(R.id.map_view) as MapView
//        mapView!!.onCreate(savedInstanceState);
//        mapView!!.getMapAsync(this)
}

/*override fun onStart() {
        super.onStart()
        mapView!!.onStart()
    }

    override fun onResume() {
        super.onResume()
        mapView!!.onResume()
    }

    override fun onDestroy() {
        mapView!!.onDestroy()
        super.onDestroy()
    }

    override fun onLowMemory() {
        super.onLowMemory()
        mapView!!.onLowMemory()
    }

    override fun onStop() {
        super.onStop()
        mapView!!.onStop()
    }

    override fun onPause() {
        mapView!!.onPause()
        super.onPause()
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        mapView!!.onSaveInstanceState(outState)
    }*/

    override fun onMapReady(googleMap: GoogleMap?) {
        map = googleMap
        map!!.setMinZoomPreference(14.0f)
        val ny = LatLng(40.7143528, -74.0059731)
        map!!.addMarker(MarkerOptions().position(ny));
        map!!.moveCamera(CameraUpdateFactory.newLatLng(ny))
    }

xml:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!--<com.google.android.gms.maps.MapView
        android:id="@+id/map_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />-->

    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.test.ui.components.overviewmap.OverviewMapFragment" />

</LinearLayout>

Манифест:

<uses-permission android:name="android.permission.INTERNET" />

    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true"/>

    <permission
        android:name="com.example.permission.MAPS_RECEIVE"
        android:protectionLevel="signature"/>
    <uses-permission android:name="com.example.permission.MAPS_RECEIVE"/>

<meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />

        <uses-library android:name="com.google.android.maps" />

Используется googleMapVersion 16.0.0:

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

1 Ответ

0 голосов
/ 22 ноября 2018

Наконец-то я нашел решение, используя MapView (который комментируется в коде) и вызвав onMapReady с небольшой задержкой.Теперь карта отображается нормально с MapView.

override fun initUI() {
        mapView?.postDelayed({
            mapView?.onCreate(Bundle())
            mapView?.getMapAsync {
                onMapReady(it)
            }
        }, 500)
    }

    private fun onMapReady(googleMap: GoogleMap?) {
        map = googleMap
//        map?.setMinZoomPreference(14.0f)
        val ny = LatLng(40.7143528, -74.0059731)
        map?.addMarker(MarkerOptions().position(ny));
        map?.moveCamera(CameraUpdateFactory.newLatLng(ny))
    }
...