Карта MapBox не инициализируется при попытке получить местоположение пользователя | Kotlin

#android #kotlin #mapbox

#Android #kotlin #mapbox

Вопрос:

Я пытаюсь получить местоположение пользователя в Android с помощью MapBox. Моя карта находится во фрагменте. Вот как я ее инициализирую.

 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)

Ответ №1:

Вы можете проверить, onMapReady() вызывается ли она, установив логическое true значение, а затем выполнить enableLocationComponent(it) :)) или onMapReady() вызвать a Handler для запуска 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)
                     }
                })
           }
  

Комментарии:

1. Проблема в том, что мое решение не использует onMapReady() . И если я попытаюсь ее использовать, ничего не произойдет. Стиль задается в этом построителе фрагментов onCreateView() или я не знаю, что это такое. Она устанавливается с помощью этого: MapView?.getMapAsync { mapboxMap -> mapboxMap.setStyle(Стиль. MAPBOX_STREETS) { //enableLocationComponent(it) } }

Ответ №2:

Итак, я наконец нашел решение.

Мне пришлось переместить набор стилей в функцию onMapReady из фрагмента onCreateView. И чем я могу вызвать 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)
    }
}