代码之家  ›  专栏  ›  技术社区  ›  gon250

映射片段(Kotlin)onMapReady不工作

  •  0
  • gon250  · 技术社区  · 5 年前

    我试图在一个片段中实现一个映射,我能够显示映射,但是 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>
    
    2 回复  |  直到 5 年前
        1
  •  14
  •   tynn    5 年前

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

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

    同时使用 as? 强制转换运算符,而不是强制转换为可选类型。或者甚至做一个普通的演员,因为你需要正确的片段 null 可能是个bug。

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

        2
  •  3
  •   Ahmed Jamal    5 年前

    您应该将值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))
          }
    
        3
  •  1
  •   user10522207 user10522207    5 年前

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

    rootView != null 这个 onMapReady

    所以我建议把它们从 伴星 onCreateView 无条件 if (rootView == null) (移除条件)。

        4
  •  1
  •   Avinash Kumar    5 年前

    使用 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" />
    
        5
  •  0
  •   Fawzi Nofal    4 年前
      override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
       
        val mapFragment = activity?.supportFragmentManager?.findFragmentById(R.id.map) as SupportMapFragment?
            mapFragment?.getMapAsync(this)
        
    
    }