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()
}
}