You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android开发求助:无需地图实现两地距离及行程信息计算

解决你的Android行程计算程序问题

Hey there! 作为自学Android开发者碰到这种卡壳的情况太正常了,我来一步步帮你拆解这个问题~

首先先纠正一个小细节:如果是让用户输入内容,EditText会比TextView更合适哦,TextView主要用来展示文本,EditText才是专门的输入控件,不过不管用哪个,核心逻辑是一致的。

第一步:收集用户输入

先把布局里的输入控件和结果展示区域搭好,示例布局代码大概是这样:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/et_departure_city"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="输入出发城市"/>

    <EditText
        android:id="@+id/et_arrival_city"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="输入到达城市"/>

    <EditText
        android:id="@+id/et_departure_date"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="输入出发日期(如2024-05-20)"/>

    <EditText
        android:id="@+id/et_departure_time"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="输入出发时间(如14:30)"/>

    <Button
        android:id="@+id/btn_calculate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="计算行程"/>

    <TextView
        android:id="@+id/tv_result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"/>
</LinearLayout>

然后在Activity里获取用户输入的内容:

val departureCity = et_departure_city.text.toString().trim()
val arrivalCity = et_arrival_city.text.toString().trim()
val departureDateStr = et_departure_date.text.toString().trim()
val departureTimeStr = et_departure_time.text.toString().trim()

第二步:获取两地距离和行程时长

这一步需要用到地理编码(把城市名转成经纬度坐标)和路线规划API。不管你用的是Google Maps、高德还是百度地图SDK,核心逻辑都是一样的:先转坐标,再调用API拿路线数据。

以高德地图SDK为例(其他工具逻辑可直接套用):

val geoCoder = GeoCoder(context)
// 先编码出发城市为经纬度
geoCoder.getFromLocationName(departureCity, 1) { addresses ->
    val departureLatLng = LatLng(addresses[0].latitude, addresses[0].longitude)
    // 再编码到达城市
    geoCoder.getFromLocationName(arrivalCity, 1) { arrivalAddresses ->
        val arrivalLatLng = LatLng(arrivalAddresses[0].latitude, arrivalAddresses[0].longitude)
        // 调用驾车路线规划API
        val routeSearch = RouteSearch(context)
        val drivingQuery = RouteSearch.DrivingRouteQuery(
            RouteSearch.FromAndTo(departureLatLng, arrivalLatLng),
            RouteSearch.DrivingDefault, null, null, ""
        )
        routeSearch.calculateDrivingRouteAsyn(drivingQuery, object : RouteSearch.OnRouteSearchListener {
            override fun onDrivingRouteSearched(result: RouteSearch.DrivingRouteResult?, errorCode: Int) {
                if (errorCode == AMapException.CODE_AMAP_SUCCESS) {
                    val route = result?.paths?.get(0)
                    val distance = route?.distance ?: 0 // 单位:米
                    val duration = route?.duration ?: 0 // 单位:秒
                    // 拿到数据后计算到达时间
                    calculateArrivalTime(departureDateStr, departureTimeStr, duration, distance)
                }
            }
            // 其他回调方法省略
        })
    }
}

第三步:计算并展示到达日期与时间

用Java 8+的java.time类处理日期时间会更省心,把出发时间加上行程时长即可:

private fun calculateArrivalTime(dateStr: String, timeStr: String, durationSeconds: Long, distance: Int) {
    val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
    // 拼接出发日期和时间,转成LocalDateTime对象
    val departureDateTime = LocalDateTime.parse("$dateStr $timeStr", formatter)
    // 加上行程时长
    val arrivalDateTime = departureDateTime.plusSeconds(durationSeconds)
    // 格式化结果并展示
    val arrivalStr = arrivalDateTime.format(formatter)
    tv_result.text = """
        两地距离:${distance / 1000}公里
        行程时长:${durationSeconds / 3600}小时${(durationSeconds % 3600) / 60}分钟
        到达时间:$arrivalStr
    """.trimIndent()
}

几个关键注意事项

  • 记得在Manifest里加网络权限:<uses-permission android:name="android.permission.INTERNET"/>
  • 第三方地图SDK需要配置对应的API Key,比如高德要在Manifest里添加meta-data标签
  • 要处理输入为空、格式错误的情况,比如用户没填城市或者日期格式不对,记得弹出提示
  • 网络请求一定要放在子线程,用Coroutines或者RxJava处理,避免ANR

如果你说的“相关工具”是某个特定的库或API,可以告诉我具体名称,我再给你更针对性的指导~

内容的提问来源于stack exchange,提问作者Just'in Pointinini

火山引擎 最新活动