Mapbox Android导航UI的NavigationViewOptions监听器无回调问题
我碰到过这个版本的坑!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
相关产品推荐
相关产品推荐

