#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)
}
}