当前位置: 首页 > 知识库问答 >
问题:

MapBox Map在尝试获取用户位置时未初始化|静态编程语言

侯沈义
2023-03-14

我正在尝试使用MapBox获取android中的用户位置。我的地图是碎片。这就是我初始化它的方式。

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?

): View? {
    // Inflate the layout for this fragment

    val root = inflater.inflate(R.layout.fragment_second, container, false)
    mapView = root.findViewById(R.id.map_view)
    mapView?.onCreate(savedInstanceState)
    mapView?.getMapAsync { mapboxMap ->

        mapboxMap.setStyle(Style.MAPBOX_STREETS) {
            enableLocationComponent(it)
        }
    }
    return root
}

当我尝试调用enableLocationComponent(it)时,应用程序正在崩溃。通常,当我从onMapReady()调用它时,它工作正常。但这是另一种情况。我真的不知道把enableLocationComponent(it)放在哪里

共有2个答案

东门清夷
2023-03-14

所以我终于找到了解决办法

我必须将样式集从Fragment onCreateView移动到onMapReady函数。然后我可以调用enableLocationComponent()。

最后的代码是这样的:

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?

): View? {
    // Inflate the layout for this fragment

    val root = inflater.inflate(R.layout.fragment_second, container, false)
    mapView = root.findViewById(R.id.map_view)
    mapView?.onCreate(savedInstanceState)
    mapView?.getMapAsync(this)
    return root
}

override fun onMapReady(mapboxMap: MapboxMap) {
    this.mapboxMap = mapboxMap
    mapboxMap.setStyle(Style.MAPBOX_STREETS) {
        enableLocationComponent(it)
    }
}
公孙宗清
2023-03-14

您可以检查是否通过设置布尔值true调用onMapReady(),然后运行enableLocationComponent(it):))或在onMapReady()中调用处理程序在需要的位置运行enableLocationComponent(it)

大概是这样的:

var mapLoaded = false
override fun onMapReady(@NonNull mapboxMap:MapboxMap) {
        this.mapboxMap = mapboxMap
        mapboxMap.setStyle(Style.Builder().fromUri(Style.MAPBOX_STREETS)
            .withSource(GeoJsonSource(CIRCLE_GEOJSON_SOURCE_ID))
            .withSource(GeoJsonSource(LINE_GEOJSON_SOURCE_ID)), object:Style.OnStyleLoaded {
            override fun onStyleLoaded(@NonNull style1:Style) {
                mapLoaded = true //then chack this value if is ture call enableLocationComponent(it)
            }
        })
    }

        lateinit var mHandler : Handler
    
    // initialize this where you want call your function
        mHandler = object:Handler(Looper.getMainLooper()) {
              override fun handleMessage(message:Message) {
                   enableLocationComponent(it)
              }
        }

//onMapReady bi like this
        override fun onMapReady(@NonNull mapboxMap:MapboxMap) {
             this.mapboxMap = mapboxMap
             mapboxMap.setStyle(Style.Builder().fromUri(Style.MAPBOX_STREETS)
                  .withSource(GeoJsonSource(CIRCLE_GEOJSON_SOURCE_ID))
                  .withSource(GeoJsonSource(LINE_GEOJSON_SOURCE_ID)), object:Style.OnStyleLoaded {
                   override fun onStyleLoaded(@NonNull style1:Style) {
                          mHandler.sendEmptyMessage(0)
                     }
                })
           }

 类似资料:
  • *编辑:好的,在修复了try catch错误后,我在< code>catch {..打印时。*,基本上,当我说我想再玩一次时,它会继续游戏,但它也会打印第一个< code>catch,然后在第23行要求输入。 嗨,这是我的第一篇文章,所以如果我在论坛上的代码格式错误,我会编辑它。 现在我正在用java eclipse编写一个游戏,其中cpu生成一个数字,用户必须猜测它。我大部分时间都在使用扫描仪类

  • 我是Kotlin的初学者,我实际上正在Kotlin中做一个Androïd应用程序。我必须初始化一些值未知的属性(它不是,但从现在开始很难定义),所以我想像在TypeScript中一样,例如:这意味着startDate的类型可以是任何东西(它不受保护,但它有助于获得值,而不是关于发生了什么)。 有没有办法在科特林做到这一点?我试过了或者如列表中的* 感谢您的阅读!

  • 问题内容: 这是一段Java代码: 它如何编译?初始化后已执行变量“ ture”的声明。据我所知,静态块和字段已经按照它们出现的顺序执行了。 现在,为什么实例块中的值9已被打印3次?顺便说一句,该类的实例已创建了3次。那不是功课,我正在学习Java进行认证。 问题答案: 关于第一个问题,静态块确实按照它们出现的顺序进行处理,但是在处理静态块之前,先处理声明。声明作为类 准备工作 的一部分(JLS§

  • 我想知道为什么在下面的代码中没有捕捉到异常: 函数的调用方式如下: 但我还是遇到了一个导致应用程序崩溃的异常: 我想说try/catch块会捕获异常,但唉。。。 什么原因导致异常没有被捕获?我想说线程并不重要,因为我使用try/get块来处理线程中的异常。 在Laalto的回答之后,我更新了代码,如下所示(对于那些感兴趣的人):

  • 静态字段何时初始化?如果我从未实例化过一个类,但我访问了一个静态字段,那么用于实例化私有静态字段的所有静态块和私有静态方法(按顺序)都在那一刻被调用了吗?或者什么时候启动应用程序?

  • 我有一个关于初始化的有趣问题。我有以下代码: 现在当我调用ErrorLookupProvider时。getInstance(),我碰到了一个NPE。中的映射未使用新的初始化。 如果我将的声明更改为final,那么我看到它已初始化。或者,即使我删除static并将其作为私有类变量