Map Fragment(Kotlin)onMapReady无法正常工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Map Fragment(Kotlin)onMapReady无法正常工作相关的知识,希望对你有一定的参考价值。

我正在尝试在片段中实现一个地图,我能够显示地图,但onMapReady无法正常工作,因为它不添加标记而不移动相机。码

MapFragment

class MapFragment : Fragment(), OnMapReadyCallback 

   private lateinit var mMap: GoogleMap

    companion object 
        var mapFragment : SupportMapFragment?=null
        val TAG: String = MapFragment::class.java.simpleName
        fun newInstance() = MapFragment()
    

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? 
        // Inflate the layout for this fragment
        var rootView = inflater.inflate(R.layout.fragment_map, container, false)

            mapFragment = fragmentManager?.findFragmentById(R.id.fallasMap) as SupportMapFragment?
            mapFragment?.getMapAsync(this)

        return rootView
    

    override fun onMapReady(googleMap: GoogleMap?) 
        mMap = googleMap!!
        // Add a marker in Sydney and move the camera
        val sydney = LatLng(-34.0, 151.0)
        mMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))
    


XML

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
             tools:context=".fragments.MapFragment">

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

</FrameLayout>
答案

您使用错误的片段管理器来访问它。因为它是片段中的片段,所以它被添加到childFragmentManager中。

childFragmentManager.findFragmentById(R.id.fallasMap) as SupportMapFragment

也可以使用as?强制转换运算符而不是强制转换为可选类型。或者甚至进行正常演员,因为你需要片段是正确的,而null将是一个bug。

如果没有正确清理片段,也不要存储片段的静态引用。

另一答案

您应该传递Value google Map以使用您的标记映射到InterAct

        override fun onMapReady(googleMap: GoogleMap?) 
        mMap = googleMap 
       // Add a marker in Sydney and move the camera
        val sydney = LatLng(-34.0, 151.0)
        mMap.addMarker(MarkerOptions().position(sydney).title("Marker in  
        Sydney"))
      mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))
      
另一答案

在您的情况下共享这些变量全局不正确,您应该从companion object中删除它们并在每次打开片段时创建一个新实例。

rootView != null onMapReady方法不会被调用。

所以我建议将它们从companion object中移除并将它们放入onCreateView而不使用条件if (rootView == null)(删除条件)。

另一答案

使用supportFragmentManager找到SupportMapFragment

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? 

    var rootView = inflater.inflate(R.layout.fragment_map, container, false)
    mapFragment = supportFragmentManager?.findFragmentById(R.id.fallasMap) as SupportMapFragment?
    mapFragment?.getMapAsync(this)

    return rootView

如果您没有自定义片段,那么也在XML文件中

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

以上是关于Map Fragment(Kotlin)onMapReady无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin:如何从 Fragment 调用 JobIntentService?

调用 Fragment 构造函数导致异常,kotlin?

Kotlin:是不是可以从 Activity-1 的 Fragment 移动到 Activity-2

Kotlin基础从入门到进阶系列讲解(基础篇)Fragment的基本使用

Kotlin基础从入门到进阶系列讲解(基础篇)Fragment的基本使用

(Kotlin)Fragment Back 堆栈句柄