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




