Android Map Utils проблемы с отображением

Я хочу добавить в свой проект Cluster.

Для этого я перенес все из тестового приложения к себе.

Но маркеры не отображаются

class MapNewTwoFragment: BaseFragment(), OnMapReadyCallback, OnClusterClickListener<MyItem> {
    lateinit var toolbar: androidx.appcompat.widget.Toolbar
    lateinit var toolbarTitle : TextView
    lateinit var imageViewBack : ImageView
    lateinit var mainActivity: MainActivity
    private var googleMap: GoogleMap? = null

    lateinit var viewModel: MapNewTwoViewModel
    private var clusterManager : ClusterManager<MyItem>? = null

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_map_new, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        setupMap()




        setupCluster()
        try {
            readItems()
        } catch (e: JSONException) {
            Toast.makeText(requireContext(), "Problem reading list of markers.", Toast.LENGTH_LONG).show()
        }



    }

    private fun setupCluster() {
        clusterManager = ClusterManager(MyApplication.applicationContext(), googleMap)
        googleMap?.setOnCameraIdleListener(clusterManager)

        clusterManager!!.markerCollection.setInfoWindowAdapter(object :
            GoogleMap.InfoWindowAdapter {
            override fun getInfoWindow(marker: Marker): View {
                val inflater = LayoutInflater.from(requireContext())
                val view = inflater.inflate(R.layout.map_cluter_item, null)
                val tvClusterTitle = view.findViewById(R.id.tv_cluster_title) as TextView
                val text = if (marker.title.isNullOrBlank()) marker.title else "ClusterItem"
                tvClusterTitle.text = text
                return view
            }

            override fun getInfoContents(marker: Marker?): View? {
                return null
            }

        })
    }

//    @Throws(JSONException::class)
    private fun readItems() {
        val inputStream = resources.openRawResource(R.raw.radar_search)
        val items: List<MyItem> = MyItemReader().read(inputStream)
        Log.d("Items", items.size.toString())
        clusterManager!!.addItems(items)
    }

    private fun setupMap(){

        val fragment = childFragmentManager.findFragmentById(R.id.googleMap) as SupportMapFragment
        fragment.getMapAsync(this)
    }


    override fun onMapReady(map: GoogleMap?) {
        googleMap = map
        googleMap?.uiSettings?.isMyLocationButtonEnabled = true
        googleMap?.uiSettings?.isZoomControlsEnabled = true
        googleMap?.uiSettings?.isCompassEnabled = true
    }


    override fun onClusterClick(cluster: Cluster<MyItem>?): Boolean {
        return false
    }
}

Подозреваю, это из-а googleMap Так как если установить

clusterManager = ClusterManager(MyApplication.applicationContext(), googleMap!!)

То приложение падает с null.

Вопрос тогда, как правильно использовать Map Для Fragment?

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

    <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/design_default_color_background"
            android:fitsSystemWindows="true"
            android:minHeight="?attr/actionBarSize"
            app:theme="@style/ToolbarColoredBackArrow">

        <androidx.constraintlayout.widget.ConstraintLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

            <ImageView
                    android:id="@+id/imageView_back"
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:padding="12dp"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent"
                    app:srcCompat="@drawable/back" />

            <TextView
                    android:id="@+id/toolbar_title"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_marginStart="8dp"
                    android:layout_marginLeft="8dp"
                    android:layout_marginEnd="8dp"
                    android:layout_marginRight="8dp"
                    android:textColor="@color/colorTextBlack"
                    android:textSize="18sp"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />

        </androidx.constraintlayout.widget.ConstraintLayout>

    </androidx.appcompat.widget.Toolbar>

    <fragment
        android:id="@+id/googleMap"
        class="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />



</LinearLayout>

Я пробовал так

val fragment = mainActivity.supportFragmentManager.findFragmentById(R.id.googleMap) as SupportMapFragment
        fragment.getMapAsync(this)

и просто parentFragmentManager

Но падает с ошибкой java.lang.NullPointerException: null cannot be cast to non-null type com.google.android.gms.maps.SupportMapFragment

Причем карта отображается, но вот точки нет, хотя они имеются

Вызывается так:

private fun loadFragment(fragment: Fragment) {
        val ft = childFragmentManager.beginTransaction()
        ft.replace(R.id.containers, fragment)
        ft.commitAllowingStateLoss()
    }

Containers - это LinearLayout в главном фрагменте (т.е эта часть подменяется на этом фрагменте)


Ответы (1 шт):

Автор решения: danilshik

Правильный порядок вызова метода

override fun onMapReady(map: GoogleMap?) {
        googleMap = map

        googleMap?.uiSettings?.isMyLocationButtonEnabled = true
        googleMap?.uiSettings?.isZoomControlsEnabled = true
        googleMap?.uiSettings?.isCompassEnabled = true
//        googleMap?.moveCamera(
//            CameraUpdateFactory.newLatLngZoom(
//                LatLng(60.036, 30.4837), 10F
//            )
//        )
        googleMap?.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(51.503186, -0.126446), 10f))
        if(googleMap == null){
            Log.d("Google Map", "null")
        }
        else{
            Log.d("Google Map", "true")
            setupCluster(googleMap!!)
        }

    }

private fun setupCluster(map: GoogleMap) {
        if(context != null) {
            Log.d("Context", "true")
            clusterManager = ClusterManager(context, map)
            map.setOnCameraIdleListener(clusterManager)

            clusterManager?.markerCollection?.setInfoWindowAdapter(object :
                GoogleMap.InfoWindowAdapter {
                override fun getInfoWindow(marker: Marker): View {
                    val inflater = LayoutInflater.from(requireContext())
                    val view = inflater.inflate(R.layout.map_cluter_item, null)
                    val tvClusterTitle = view.findViewById(R.id.tv_cluster_title) as TextView
                    val text = if (marker.title.isNullOrBlank()) marker.title else "ClusterItem"
                    tvClusterTitle.text = text
                    return view
                }

                override fun getInfoContents(marker: Marker?): View? {
                    return null
                }

            })

            readItems()

        }
    }
→ Ссылка