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

时间:2019-03-04 22:49:35

标签: android google-maps kotlin

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

MapFragment

onMapReady

xml

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

}

5 个答案:

答案 0 :(得分:1)

您应该将Value googleMap传递给mMap并与标记一起传递给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))
      }

答案 1 :(得分:1)

您使用了错误的片段管理器来访问它。由于它是片段中的一个片段,因此将其添加到childFragmentManager中。

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

也可以使用as?强制转换运算符,而不是强制转换为可选类型。甚至进行常规转换,因为您需要正确的片段并且null将是一个错误。

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

答案 2 :(得分:0)

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

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

因此,我建议将其从companion object中删除,然后将其放入onCreateView中,且不附加条件if (rootView == null)(除去条件)。

答案 3 :(得分:0)

  

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

答案 4 :(得分:0)

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
   
    val mapFragment = activity?.supportFragmentManager?.findFragmentById(R.id.map) as SupportMapFragment?
        mapFragment?.getMapAsync(this)
    

}