Щелкающий маркер Google Maps во фрагменте

Здесь я пытаюсь показать 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 должен запускаться сам, но этого никогда не происходит! Есть идеи, почему? Спасибо.

0
0
1 217
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не знаю почему, но 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;
                }
            });
        }
    });

Другие вопросы по теме