You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin实现地图路径点击本地存储功能的方法咨询

实现路径点击保存与本地检索方案

一、给路径Polyline添加点击事件

你当前创建的roadOverlay(路径Polyline)默认无点击响应,需开启点击能力并设置监听器。在创建roadOverlay的代码后添加以下逻辑:

roadOverlay.isClickable = true
roadOverlay.setOnClickListener { _, _, _ ->
    showSavePathConfirm(startPoint, endPoint, road)
    true
}

注:返回true表示事件已被消费,避免后续传递;确保startPoint、endPoint、road在当前作用域可访问(可将road提升为类成员变量)。

二、定义路径存储数据模型

Road对象无法直接序列化存储,需定义可序列化的数据类保存核心信息:

data class SavedPath(
    val id: String = UUID.randomUUID().toString(), // 唯一标识
    val startLat: Double,
    val startLng: Double,
    val endLat: Double,
    val endLng: Double,
    val duration: Int, // 路径时长(秒)
    val length: Int, // 路径长度(米)
    val saveTime: Long = System.currentTimeMillis() // 保存时间戳
)

三、实现本地存储工具类

新手优先用SharedPreferences实现轻量存储,借助Gson将数据类转为JSON字符串:

  1. 在build.gradle(Module level)添加Gson依赖:
dependencies {
    implementation 'com.google.code.gson:gson:2.10.1'
}
  1. 创建存储工具类PathStorageHelper:
class PathStorageHelper(private val context: Context) {
    private val sharedPref = context.getSharedPreferences("saved_paths", Context.MODE_PRIVATE)
    private val gson = Gson()

    // 保存路径
    fun savePath(path: SavedPath) {
        val allPaths = getAllSavedPaths().toMutableList()
        allPaths.add(path)
        sharedPref.edit().putString("paths_list", gson.toJson(allPaths)).apply()
    }

    // 获取所有已保存路径
    fun getAllSavedPaths(): List<SavedPath> {
        val json = sharedPref.getString("paths_list", "[]") ?: "[]"
        return gson.fromJson(json, object : TypeToken<List<SavedPath>>() {}.type)
    }

    // 删除指定路径(可选)
    fun deletePath(pathId: String) {
        val filteredPaths = getAllSavedPaths().filter { it.id != pathId }
        sharedPref.edit().putString("paths_list", gson.toJson(filteredPaths)).apply()
    }
}

四、完善点击后的保存确认逻辑

添加弹窗确认保存,避免误操作:

private fun showSavePathConfirm(start: GeoPoint, end: GeoPoint, road: Road) {
    AlertDialog.Builder(context)
        .setTitle("保存路径")
        .setMessage("确认保存这条路径吗?")
        .setPositiveButton("保存") { _, _ ->
            val savedPath = SavedPath(
                startLat = start.latitude,
                startLng = start.longitude,
                endLat = end.latitude,
                endLng = end.longitude,
                duration = road.mDuration,
                length = road.mLength
            )
            PathStorageHelper(context).savePath(savedPath)
            Toast.makeText(context, "路径已保存", Toast.LENGTH_SHORT).show()
        }
        .setNegativeButton("取消", null)
        .show()
}

五、已保存路径的检索与展示

  1. 读取本地路径并展示在列表(如RecyclerView):
// 在列表页初始化时读取
val savedPaths = PathStorageHelper(context).getAllSavedPaths()
// 将savedPaths绑定到RecyclerView适配器
  1. 点击列表项重新绘制路径:
fun onSavedPathClick(path: SavedPath) {
    routePath(
        path.startLat,
        path.startLng,
        path.endLat,
        path.endLng
    )
}

注意事项

  • 若需保存完整路径坐标而非重新生成,可在SavedPath中添加points: List<GeoPoint>字段,存入roadOverlay.points;
  • 路径数量较多时,建议替换为Room数据库实现更高效的存储与检索;
  • Android 10及以下需在Manifest中添加存储权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29"/>

内容的提问来源于stack exchange,提问作者George Jung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:09:24