Здесь я пытаюсь показать AlertDialog, когда я нажимаю на маркер, который динамически добавляется при загрузке (вызовите API, получите позиции и покажите их на карте). Это делается во фрагментах onCreateView.
Карта загружается здесь:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
FragmentManager fm = getChildFragmentManager();
mapFragment = (SupportMapFragment) fm.findFragmentById(R.id.map_container);
if (mapFragment == null) {
mapFragment = SupportMapFragment.newInstance();
fm.beginTransaction().replace(R.id.map_container, mapFragment).commit();
}
}
Позже я переключаюсь с SupportMapFragment на GoogleMap:
@Override
public void onResume() {
super.onResume();
if (mMap == null && mapFragment != null) {
mapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = Tools.configBasicGoogleMap(googleMap);
mMap.setMapType(sharedPref.getMapType());
}
});
}
}
Итак, по логике, моя карта должна быть готова как mMap. Теперь я хочу показать AlertDialog, поэтому я добавляю implements GoogleMap.OnMarkerClickListener в определение класса для фрагмента и реализую его здесь:
@Override
public boolean onMarkerClick(final Marker marker) {
Toast.makeText(getContext(), "Hello world", Toast.LENGTH_SHORT).show();
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle("Confirmation");
builder.setMessage("Pour confirmer le rapport, appuyez sur + 1.\nSi le rapport est faux, cliquez sur - 1.");
builder.setPositiveButton("+ 1", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id){
URL link = null;
try {
link = new URL(S.base_url + "report/increment/" + marker.getTag().toString());
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(
link.openStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
});
AlertDialog ab = builder.create();
ab.show();
return false;
}
Но даже Toast не отображается ... Когда я нажимаю на маркер, я получаю кнопки Directions и Open in Google Maps, и карта центрируется на маркере, но мой метод не запускается.
В заключение, логически, когда я щелкаю один из этих маркеров, которые я загружаю, метод onMarkerClick должен запускаться сам, но этого никогда не происходит! Есть идеи, почему? Спасибо.
Я не знаю почему, но Google Maps API не может использоваться как реализация для фрагментов. Следующий код может сработать для вас. Вам просто нужно назначить markerClickListener для локального, а не для реализации MarkerClickListener.
//Detect location and set on map
mMapView.getMapAsync(new OnMapReadyCallback() {
@SuppressLint("MissingPermission")
@Override
public void onMapReady(GoogleMap mMap) {
googleMap = mMap;
// Bla
// Bla
// Bla your codes about map
googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
// Triggered when user click any marker on the map
return false;
}
});
}
});