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

Mapbox Android导航UI的NavigationViewOptions监听器无回调问题

解决Mapbox Android Navigation 0.11.1中自定义路线导航UI回调不触发的问题

我碰到过这个版本的坑!0.11.1的NavigationLauncher确实存在一个问题:它内部没有正确传递你在NavigationViewOptions上设置的监听器,导致你设置的回调完全被忽略了。要解决这个问题,咱们可以绕开NavigationLauncher,直接使用NavigationView来实现导航UI,这样能直接绑定监听器,确保回调正常触发。

具体实现步骤

1. 在布局文件中添加NavigationView

首先在你的Activity布局里加入NavigationView组件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.mapbox.services.android.navigation.ui.v5.NavigationView
        android:id="@+id/navigationView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

2. 在Activity中初始化导航并绑定监听器

直接在Activity里初始化NavigationView,传入自定义路线,同时设置你需要的监听器:

class CustomNavigationActivity : AppCompatActivity(), NavigationListener {

    private lateinit var navigationView: NavigationView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_custom_navigation)

        navigationView = findViewById(R.id.navigationView)

        // 准备你的自定义路线(这里假设你已经有了Route对象)
        val customRoute: Route = getYourCustomRoute()

        // 构建NavigationViewOptions,设置路线和监听器
        val options = NavigationViewOptions.builder()
            .navigationListener(this)
            .route(customRoute)
            .build()

        // 启动导航
        navigationView.startNavigation(options)
    }

    // 实现NavigationListener的回调方法
    override fun onNavigationStarted() {
        // 导航开始时的逻辑
        Log.d("Navigation", "导航已启动")
    }

    override fun onNavigationRunning() {
        // 导航进行中的逻辑
    }

    override fun onNavigationFinished() {
        // 导航结束时的逻辑
        finish()
    }

    override fun onNavigationCanceled() {
        // 导航取消时的逻辑
        finish()
    }

    // 处理生命周期,避免内存泄漏
    override fun onStart() {
        super.onStart()
        navigationView.onStart()
    }

    override fun onResume() {
        super.onResume()
        navigationView.onResume()
    }

    override fun onPause() {
        super.onPause()
        navigationView.onPause()
    }

    override fun onStop() {
        super.onStop()
        navigationView.onStop()
    }

    override fun onDestroy() {
        super.onDestroy()
        navigationView.onDestroy()
    }

    private fun getYourCustomRoute(): Route {
        // 这里替换成你获取自定义路线的逻辑
        return yourCustomRouteInstance
    }
}

为什么NavigationLauncher会失效?

在0.11.1版本的NavigationLauncher#startNavigation源码里,它内部会创建一个新的NavigationViewOptions实例,但没有把你传入的options里的监听器传递过去,相当于你的监听器设置完全被覆盖了。直接使用NavigationView就绕开了这个问题,因为监听器是直接绑定到UI组件上的,不会被中间层忽略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:20:27