程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Kotlin & Firebase : 根据点击的地图标记在底部工作表中显示不同的数据大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Kotlin & Firebase : 根据点击的地图标记在底部工作表中显示不同的数据?

开发过程中遇到Kotlin & Firebase : 根据点击的地图标记在底部工作表中显示不同的数据的问题如何解决?下面主要结合日常开发的经验,给出你关于Kotlin & Firebase : 根据点击的地图标记在底部工作表中显示不同的数据的解决方法建议,希望对你解决Kotlin & Firebase : 根据点击的地图标记在底部工作表中显示不同的数据有所启发或帮助;

我正在使用 Kotlin。我有一张地图,显示与 Firebase 中存在的数据不同的标记(经度、纬度)。 这方面一切正常。

但我现在想在单击标记时在底部表中显示其余的 Firebase 数据。 为此,我创建了一个底部工作表,当我单击地图上的标记(使用 setonMarkerClickListener)时会显示该工作表。 但是现在,我不知道如何根据点击的标记显示数据。

这是我的名为“MIssion”的数据库。

Kotlin & Firebase : 根据点击的地图标记在底部工作表中显示不同的数据

这是我单击标记时显示的底部工作表。效果很好。

Kotlin & Firebase : 根据点击的地图标记在底部工作表中显示不同的数据

这是地图的代码。

package com.example.givenaskv1.fragment

import androID.os.bundle
import androID.vIEw.LayoutInflater
import androID.vIEw.VIEw
import androID.vIEw.VIEwGroup
import androIDx.fragment.app.Fragment
import com.airbnb.lottIE.model.Marker
import com.example.givenaskv1.Map.bottomsheetMissionMap
import com.example.givenaskv1.R
import com.Google.androID.gms.maps.CameraupdateFactory
import com.Google.androID.gms.maps.GoogleMap
import com.Google.androID.gms.maps.OnMapReadyCallBACk
import com.Google.androID.gms.maps.model.bitmapDescriptorFactory
import com.Google.androID.gms.maps.model.LatLng
import com.Google.androID.gms.maps.model.MarkerOptions
import com.Google.firebase.database.*
import kotlinx.androID.synthetic.main.fragment_map.*

private lateinit var mMap: GoogleMap

class MapFragment : Fragment(),OnMapReadyCallBACk {
    
    private lateinit var dbref : DatabaseReference
    var marker: Marker? = null
    
    overrIDe fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceStatE)

        map_vIEw.onCreate(savedInstanceStatE)
        map_vIEw.onResume()
        map_vIEw.getMapAsync(this)
        
    }
    overrIDe fun onMapReady(GoogleMap: GoogleMap?) {
        mMap = GoogleMap!!
        // GOES UP TO 21
        val zoomLevel = 14.0f 
        // MARKER FROM DATABASE
        dbref = FirebaseDatabase.geTinstance().getReference("Mission")
        dbref.addValueEventListener(object : ValueEventListener {
            overrIDe fun onDataChange(snapshot: DataSnapshot) {
                if (snapshot.exists()) {
                    for (missionSnapshot in snapshot.children) {
                        val lat: String = missionSnapshot.child("latitude").value.toString()
                        val lng: String = missionSnapshot.child("longitude").value.toString()
                        val latitude = lat.todouble()
                        val longitude = lng.todouble()
                        val loc = LatLng(latitude,longitudE)
                        val IDMission = missionSnapshot.child("postID").value.toString()
                        GoogleMap.addMarker(
                            MarkerOptions().position(loC)
                                .title(IDMission).icon(
                                    BitmapDescriptorFactory.fromresource(R.drawable.pinroll))

                        )}
                }
            }
            overrIDe fun onCancelled(error: DatabaseError) {
                Todo("Not yet implemented")
            }
        })
        // Add a marker in Sydney and move the camera
        val paris = LatLng(48.82,2.28)

        mMap.addMarker(MarkerOptions().position(paris).title("BIEnvenue à Paris").icon(
            BitmapDescriptorFactory.fromresource(R.drawable.pinroll)))
        mMap.moveCamera(CameraupdateFactory.newLatLng(paris))
        mMap.moveCamera(CameraupdateFactory.newLatLngZoom(paris,zoomLevel));

        // OPEN BottOMSHEET WHEN CliCKED
        GoogleMap.setonMarkerClickListener(GoogleMap.onMarkerClickListener {
            val bottomSheet = BottomsheetMissionMap()
            bottomSheet.show(requireFragmentManager(),"BottomSheet")
            false
        })

    }
    
    overrIDe fun onCreateVIEw(
        inflater: LayoutInflater,container: VIEwGroup?,savedInstanceState: Bundle?
    ): VIEw? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_map,container,falsE)
    }
}

你能帮我吗?

解决方法

请检查注释为 /* ==== updatED CODE ==== */

的行
override fun onMapReady(googleMap: GoogleMap?) {
        mMap = googleMap!!
        // GOES UP TO 21
        val zoomLevel = 14.0f
        // MARKER FROM DATABASE
        dbref = FirebaseDatabase.geTinstance().getReference("Mission")
        dbref.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                if (snapshot.exists()) {
                    for (missionSnapshot in snapshot.children) {
                        val lat: String = missionSnapshot.child("latitude").value.toString()
                        val lng: String = missionSnapshot.child("longitude").value.toString()
                        val latitude = lat.toDouble()
                        val longitude = lng.toDouble()
                        val loc = LatLng(latitude,longitudE)
                        val idMission = missionSnapshot.child("postid").value.toString()
                        
                        /* ==== updatED CODE ==== */
                        val mMarker = googleMap.addMarker(
                            MarkerOptions().position(loC)
                                .title(idMission).icon(
                                    BitmapDescriptorFactory.fromresource(R.drawable.pinroll)
                                )
                        )

                        /* ==== updatED CODE ==== */
                        mMarker?.tag = idMission as String? // or any other desired id 
                    }
                }
            }

            override fun onCancelled(error: DatabaseError) {
                TODO("Not yet implemented")
            }
        })
        // Add a marker in Sydney and move the camera
        val paris = LatLng(48.82,2.28)

        mMap.addMarker(
            MarkerOptions().position(paris).title("Bienvenue à Paris").icon(
                BitmapDescriptorFactory.fromresource(R.drawable.pinroll)
            )
        )
        mMap.moveCamera(CameraupdateFactory.newLatLng(paris))
        mMap.moveCamera(CameraupdateFactory.newLatLngZoom(paris,zoomLevel));

        // OPEN BOTTOMSHEET WHEN CLICKED
        googleMap.setOnMarkerClickListener(GoogleMap.onMarkerClickListener {

            /* ==== updatED CODE ==== */
            val id = it.tag as String?
            if (!id.isNullOrEmpty() && id == /* COMPARE WITH YOUR ID */) {
                // if true,fetch data here for bottom sheet
            } else {
                // do something else here
            } 
            
            false
        })

    }
,

正如我在您的屏幕截图中看到的,您的标记标题实际上是您正在显示的对象的键。由于您已经拥有密钥,因此在标记上单击 add the title to a Bundle object,因此可以在第二个活动中使用它。

在第二个活动中,获取标题的字符串表示,并将其用于精确指向存储在捆绑包中的键的引用中。进行新的数据库调用并获取相应的数据,以便将其显示在您的视图中。就这样!

大佬总结

以上是大佬教程为你收集整理的Kotlin & Firebase : 根据点击的地图标记在底部工作表中显示不同的数据全部内容,希望文章能够帮你解决Kotlin & Firebase : 根据点击的地图标记在底部工作表中显示不同的数据所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。