【问题标题】:Map Fragment(Kotlin) onMapReady not working地图片段(Kotlin)onMapReady 不工作
【发布时间】:2019-03-04 22:49:34
【问题描述】:

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

地图片段

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>

【问题讨论】:

  • 应用程序从来没有进入过onMapReady我加了断点但是从来没有停止过。

标签: android google-maps kotlin


【解决方案1】:

您使用了错误的片段管理器来访问它。由于是fragment中的fragment,所以添加到childFragmentManager中。

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

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

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

【讨论】:

    【解决方案2】:

    您应该将值 googleMap 传递给 mMap 以与您的标记进行交互

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

    【讨论】:

    • 我正在传递值,但它不起作用。应用程序永远不会进入onMapReady 我已经添加了一个断点但永远不会停止。 @ahmed-jamal
    • 尝试使用 childSupportFragment 管理器而不是 fragmentManager
    • 你是正确的,所以我将代码更新为mapFragment = childFragmentManager.findFragmentById(R.id.fallasMap) as SupportMapFragment? 并且它的工作:)。只需更新您的答案以接受您的正确答案。
    • 使用 childFragmentManager 而不是 fragmentManager 对我有用。
    【解决方案3】:

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

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

    所以我建议将它们从companion object 中删除,然后将它们放入onCreateView 中,不带条件if (rootView == null)(删除条件)。

    【讨论】:

    • 标记将始终相同,因此我不需要编辑已创建的地图。但主要问题是应用程序永远不会进入 onMapReady,我不知道为什么。
    • @gon250 我不需要编辑创建的地图,所以你需要使用另一种方式,例如saveInstance,因为目前的方式是问题。
    【解决方案4】:

    使用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" />
    

    【讨论】:

    • 由于某种原因,当 childFragmentManager 没有时,这对我有用。我的代码几乎与 OP 完全相同,只是我使用的是 viewBindings。好奇为什么/有什么区别?
    【解决方案5】:
      override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
       
        val mapFragment = activity?.supportFragmentManager?.findFragmentById(R.id.map) as SupportMapFragment?
            mapFragment?.getMapAsync(this)
        
    
    }
    

    【讨论】:

    • 请提供一些详细信息以获取更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多