android - ViewPager 中 Fragment 中的 MapView:调用 getMapAsync() 后永远不会调用 onMapReady()
问题描述
我尝试在我的应用程序中使用地图,更准确地说是在ViewPager
页面/片段中。我想要的是从谷歌表中获取数据,然后使用从谷歌表数据生成的图钉更新地图。
我已经有一个可以完美运行的应用程序,但是有一个活动和一个 MapFragment。当我尝试将其转换为ViewPager
withMapView
和片段时,我尝试调用getMapAsync()
片段的onViewCreated
.
但是,onMapReady()
此后从未调用过。我错过了什么吗?我试图覆盖片段的生命周期方法以插入MapView
's 的方法,但它没有改变任何东西。
如果有人遇到过这种问题,欢迎提供帮助,我让我的代码在下面。
StoreLocatorFragment:
private lateinit var mMap: GoogleMap
private val markers = mutableListOf<ShopMarkerData>()
private lateinit var fusedLocationClient: FusedLocationProviderClient
private var lastLocation: Location? = null
private lateinit var lastMarker: ShopMarkerData
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
enovap_mv.getMapAsync(this)
fusedLocationClient = LocationServices.getFusedLocationProviderClient(context!!)
fusedLocationClient.lastLocation
.addOnSuccessListener { location : Location? ->
lastLocation = location
}
[...]
}
override fun onResume() {
super.onResume()
// Function launching the data retrieving on the Google Sheets
}
override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap
mMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(context, R.raw.maps_style))
mMap.setOnMapClickListener {
if (layout_selected_marker.visibility == View.VISIBLE) {
layout_selected_marker.startAnimation(
AnimationUtils.loadAnimation(
context,
R.anim.maps_card_out
)
)
}
layout_selected_marker.visibility = View.GONE
}
mMap.setOnMarkerClickListener {
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(LatLng(it.position.latitude, it.position.longitude), 14f))
for (shop in markers) {
if (shop.lat == it.position.latitude && shop.lng == it.position.longitude) {
layout_selected_marker.visibility = View.VISIBLE
layout_selected_marker.startAnimation(AnimationUtils.loadAnimation(context, R.anim.maps_card_in))
lastMarker = shop
tv_shop_name.text = shop.name
tv_shop_address.text = shop.street
tv_shop_city.text = getString(R.string.city_assemble, shop.postcode, shop.city)
tv_shop_country.text = shop.country
tv_shop_phone.text = shop.phone
}
}
true
}
}
private fun getRequestValues(values: List<List<Any>>?) {
if (values == null)
return
for (row in values) {
val shop = ShopMarkerData("", "", "", "", "", "", "", 0.0, 0.0)
for (i in row.indices) {
when (i) {
0 -> shop.name = row[i] as String
1 -> shop.street = row[i] as String
3 -> shop.postcode = row[i] as String
4 -> shop.city = row[i] as String
5 -> shop.country = row[i] as String
6 -> shop.phone = row[i] as String
7 -> shop.address = row[i] as String
8 -> shop.lat = (row[i] as String).toDouble()
9 -> shop.lng = (row[i] as String).toDouble()
}
}
markers.add(shop)
}
for (place in markers) {
val pos = LatLng(place.lat, place.lng)
val bitmapDescriptor = bitmapDescriptorFromVector(context!!, R.drawable.ic_pin)
mMap.addMarker(MarkerOptions().position(pos).title(place.address).icon(bitmapDescriptor))
}
mMap.isMyLocationEnabled = true
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(LatLng(lastLocation!!.latitude, lastLocation!!.longitude), 14f))
}
XML 布局:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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"
xmlns:app="http://schemas.android.com/apk/res-auto">
<com.google.android.gms.maps.MapView
android:id="@+id/enovap_mv"
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"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="@id/guideline1"
/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/layout_selected_marker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/guideline1"
app:layout_constraintBottom_toBottomOf="parent"
android:padding="16dp"
android:layout_margin="16dp"
android:orientation="vertical"
android:background="@drawable/button_shape_default"
android:elevation="2dp"
android:clickable="true"
android:focusable="true">
<TextView
android:id="@+id/tv_shop_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:textColor="#000000"
android:textStyle="bold"
android:textSize="20sp"
tools:text="Green and Vape"
/>
<LinearLayout
android:id="@+id/layout_address"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintTop_toBottomOf="@id/tv_shop_name"
app:layout_constraintBottom_toBottomOf="parent">
<TextView
android:id="@+id/tv_shop_address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
tools:text="23 rue du Roule"
android:textSize="16sp"
android:textStyle="bold"
/>
<TextView
android:id="@+id/tv_shop_city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
tools:text="75001 PARIS"
android:textSize="16sp"
android:textStyle="bold"
/>
<TextView
android:id="@+id/tv_shop_country"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
tools:text="France"
android:textSize="16sp"
android:textStyle="bold"
/>
<TextView
android:id="@+id/tv_shop_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:drawableEnd="@drawable/ic_phone"
android:drawablePadding="4dp"
android:gravity="bottom"
android:textSize="16sp"
android:textStyle="bold"
tools:text="01 40 13 09 57" />
</LinearLayout>
<Button
android:id="@+id/btn_direction"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="@id/layout_address"
app:layout_constraintEnd_toEndOf="@id/layout_address"
android:text="Route"
android:elevation="2dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.65"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
解决方案
我在片段中遇到过同样的问题,我应用了以下代码。希望对你有帮助
public override fun onResume() {
mapView.onResume()
super.onResume()
}
public override fun onPause() {
super.onPause()
mapView.onPause()
}
public override fun onDestroy() {
super.onDestroy()
if (mapView != null) {
mapView.onDestroy()
}
}
override fun onLowMemory() {
super.onLowMemory()
mapView.onLowMemory()
}
推荐阅读
- java - @Slf4j 找不到符号 LOG
- pine-script - 收益线,从输入值绘制一条线
- python - pyodbc.Error: ('07002', '[07002] [Microsoft][ODBC Microsoft Access Driver] 参数太少。预期为 9. (-3010) (SQLExecDirectW)')
- javascript - 屏幕调整大小时重置切换(多种样式)
- react-router - 如何使用 Apollo 和 React Router 避免嵌套路由/查询组件的请求瀑布?
- android - Android Mokito 测试室 DAO 类。在测试时从数据库中获取数据时获取空数组
- python-3.x - 计算每个 id 有多少行满足条件
- jquery - 根据表单输入显示嵌入式视频
- laravel - Lumen:BrowserSync 与 Laravel Mix
- ruby-on-rails - Rails activerecord 查询使用选择但返回集合