#java #android #firebase #google-maps #huawei-mobile-services
# #java #Android #firebase #google-карты #huawei-мобильные сервисы
Вопрос:
Здравствуйте, я создаю приложение на Android с Java, huawei maps и firebase, но у меня есть проблема, которую я не могу решить в течение нескольких дней, заключается в том, что при нажатии на маркер карты и отображении данных в текстовом представлении мне отображается только последняя запись моей базы данных, а не маркер, который я выбираю.
public void listarMarcadores(DataSnapshot dataSnapshot) {
try {
final String key = dataSnapshot.getKey();
HashMap<String, Object> value = (HashMap<String, Object>) dataSnapshot.getValue();
double lat;
double lon;
final String nombre;
final String tipo;
final String descripcion;
lat = Double.parseDouble(value.get("latitud").toString());
lon = Double.parseDouble(value.get("longitud").toString());
nombre = (String) value.get("nombre_puesto");
tipo = (String) value.get("tipo_ambulante");
descripcion = (String) value.get("descripcion");
LatLng ubicacion = new LatLng(lat, lon);
Marker mimarker;
hMap.setOnMarkerClickListener(new HuaweiMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
txtKey.setText(key);
txtNombre_puesto.setText(nombre);
txtDescripcion.setText(descripcion);
txtTipo.setText(tipo);
//, txtDireccion, txtHorario
mBottomSheetBehavior1.setState(BottomSheetBehavior.STATE_EXPANDED);
return false;
}
});
if (!mMarkers.containsKey(key)) {
if (tipo.equals("cevicheria")) {
mimarker = hMap.addMarker(new MarkerOptions().title(key).position(ubicacion).icon(BitmapDescriptorFactory.fromResource(R.drawable.pescado)));
mMarkers.put(key, mimarker).setIcon(BitmapDescriptorFactory.fromResource(R.drawable.pescado));
}
if (tipo.equals("chicharroneria")) {
mimarker = hMap.addMarker(new MarkerOptions().title(key).position(ubicacion).icon(BitmapDescriptorFactory.fromResource(R.drawable.cerdo)));
mMarkers.put(key, mimarker).setIcon(BitmapDescriptorFactory.fromResource(R.drawable.cerdo));
;
} else {
mimarker = hMap.addMarker(new MarkerOptions().title(key).position(ubicacion));
mMarkers.put(key, mimarker);
}
}
} catch (Exception e) {
Toast.makeText(this, "Error al listar marcadores", Toast.LENGTH_SHORT).show();
}
}
Комментарии:
1. Прежде чем использовать Huawei Map Kit, вы сначала интегрировали HMS SDK в свою Android Studio? Кстати, поддерживаемые устройства Map Kit — это только устройства Huawei.
2. Ширли да, я знаю
3. Вы не можете получить маркеры с карты Google или карты huawei? Если вы используете huawei map kit для кластеризации маркеров, рекомендуется использовать инструмент здесь: github.com/billtom20/3rd-maps-utils
Ответ №1:
Рекомендуется использовать этот полезный инструмент, основанный на инструменте Google с открытым исходным кодом и адаптируемый к Huawei Map cluster manager. Вы можете интегрировать инструмент для кластеризации маркеров.
Использование:
- Откройте Gradle, нажмите библиотека-> Задачи-> сборка-> сборка.
- После запуска найдите файл 3rd-maps-utils-2.1.0-yyyyMMdd.aar в library/build/outputs/aar/ path.
- Скопируйте файл 3rd-maps-utils-2.1.0-yyyyMMdd.aar в ваше собственное приложение / библиотеки / path.
- Добавьте коды ниже в файл project build.gradle.
allprojects {
repositories {
...
flatDir {
dirs 'libs'
}
}
}
- Добавьте коды ниже в файл app build.gradle.
dependencies {
implementation(name: '3rd-maps-utils-2.1.0-yyyyMMdd', ext: 'aar')
...
}
Вы также можете ознакомиться с этой документацией: Маркеры кластеризации. Или обратитесь к образцу кода:
@Override
public void onMapReady(HuaweiMap map) {
hMap = map;
hMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
new LatLng(48.893478, 2.334595),10));
hMap.addMarker(new MarkerOptions().position(new LatLng(48.891478, 2.334595)).title("Marker1").clusterable(true));
hMap.addMarker(new MarkerOptions().position(new LatLng(48.892478, 2.334595)).title("Marker2").clusterable(true));
hMap.addMarker(new MarkerOptions().position(new LatLng(48.893478, 2.334595)).title("Marker3").clusterable(true));
hMap.addMarker(new MarkerOptions().position(new LatLng(48.894478, 2.334595)).title("Marker4").clusterable(true));
hMap.addMarker(new MarkerOptions().position(new LatLng(48.895478, 2.334595)).title("Marker5").clusterable(true));
hMap.addMarker(new MarkerOptions().position(new LatLng(48.896478, 2.334595)).title("Marker6").clusterable(true));
hMap.setMarkersClustering(true);
}
Ответ №2:
Внутри setOnMarkerClickListener вы устанавливаете объекты ниже (я предполагаю, что это текстовые представления) со значениями, которые вы извлекли из Firebase, но они никогда не обновляются с помощью объекта LatLng. Кроме того, объект LatLng никогда не обновляется после его первоначальной установки. Пожалуйста, убедитесь, что ваши объекты данных обновлены соответствующим образом, иначе он будет возвращать одно и то же значение каждый раз.
txtKey.setText(key);
txtNombre_puesto.setText(nombre);
txtDescripcion.setText(descripcion);