Google Maps API v2: Làm cách nào để đánh dấu có thể nhấp được?


128

Làm cách nào để làm cho các điểm đánh dấu trong Android Google Maps API v2 trở nên có thể nhấp để chúng có thể hiển thị một menu với các tùy chọn hoặc chỉ bắt đầu một hoạt động mới? Tôi tin rằng tôi đã tạo các điểm đánh dấu trong ứng dụng của mình hiện tại theo phương pháp "newb". Tôi đã không gán cho họ một tên hoặc một phương thức để có thể liên kết nó với phần còn lại của mã được yêu cầu.

googleMap.addMarker(new MarkerOptions()
        .position(latLng)
        .title("My Spot")
        .snippet("This is my spot!")
        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));

Nếu bạn TRẢ LỜI điều này, vui lòng bao gồm mã mẫu của một điểm đánh dấu được giới thiệu với một tên duy nhất và sau đó được đặt thành có thể nhấp để mở một hoạt động mới.

Câu trả lời:


238

Tất cả các điểm đánh dấu trong Google Android Maps Api v2 đều có thể nhấp được. Bạn không cần đặt bất kỳ thuộc tính bổ sung nào cho điểm đánh dấu của mình. Những gì bạn cần làm - là đăng ký gọi lại đánh dấu vào googleMap của bạn và xử lý nhấp trong gọi lại:

public class MarkerDemoActivity extends android.support.v4.app.FragmentActivity
    implements OnMarkerClickListener
{
    private Marker myMarker;    

    private void setUpMap()
    {
        .......
        googleMap.setOnMarkerClickListener(this);

        myMarker = googleMap.addMarker(new MarkerOptions()
                    .position(latLng)
                    .title("My Spot")
                    .snippet("This is my spot!")
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
        ......
    }

    @Override
    public boolean onMarkerClick(final Marker marker) {

        if (marker.equals(myMarker)) 
        {
            //handle click here
        }
    }
}

Đây là một hướng dẫn tốt trên google về tùy chỉnh đánh dấu


9
Có cách nào để nghe các nhấp chuột trên cửa sổ bật lên không? Một trong đó hiển thị tiêu đề / đoạn trích của bạn?

40
điều tương tự như với các điểm đánh dấu - bạn cần phải đăng ký OnInfoWindowClickListenerCallback. Có một phương pháp trong GoogleMap cho điều đó:googleMap.setOnInfoWindowClickListener(listener);
Pavel Dudka

Hiện tại tất cả đều hoạt động rất tốt, tôi nhận thấy lỗi của mình là không đặt nó làm biến trước đó trong mã. Tôi chỉ đơn giản là quên ";" và mã được triển khai
Malaka

1
@JDOaktown bạn cần kiểm tra này nếu bạn có logic khác nhau cho các điểm đánh dấu khác nhau. Hãy nói rằng bạn chỉ muốn hiển thị bánh mì nướng khi nhấp vào điểm đánh dấu cụ thể. Nếu bạn có cùng logic xử lý cho tất cả các điểm đánh dấu của mình - bạn không cần kiểm tra điểm đánh dấu
Pavel Dudka

1
Như đã đề cập trong tài liệu ( developers.google.com/android/reference/com/google/android/gms/ mẹo ), bạn cần trả về true nếu nhấp chuột đã được sử dụng. Nếu bạn trả về sai - hành vi mặc định sẽ xảy ra
Pavel Dudka

36

setTag(position) trong khi thêm điểm đánh dấu vào bản đồ.

Marker marker =  map.addMarker(new MarkerOptions()
                .position(new LatLng(latitude, longitude)));
marker.setTag(position);

getTag()trên setOnMarkerClickListenerngười nghe

map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                @Override
                public boolean onMarkerClick(Marker marker) {
                    int position = (int)(marker.getTag());
                   //Using position get Value from arraylist 
                    return false;
                }
            });

4

Tránh sử dụng Activity thực hiện OnMarkerClickListener, sử dụng OnMarkerClickListener cục bộ

// Not a good idea
class MapActivity extends Activity implements OnMarkerClickListener {
}

Bạn sẽ cần một bản đồ để tra cứu mô hình dữ liệu gốc được liên kết với điểm đánh dấu

private Map<Marker, Map<String, Object>> markers = new HashMap<>();

Bạn sẽ cần một mô hình dữ liệu

private Map<String, Object> dataModel = new HashMap<>();

Đặt một số dữ liệu trong mô hình dữ liệu

dataModel.put("title", "My Spot");
dataModel.put("snipet", "This is my spot!");
dataModel.put("latitude", 20.0f);
dataModel.put("longitude", 100.0f);

Khi tạo điểm đánh dấu mới bằng mô hình dữ liệu, hãy thêm cả hai vào bản đồ nhà sản xuất

Marker marker = googleMap.addMarker(markerOptions);
markers.put(marker, dataModel);

Đối với sự kiện đánh dấu nhấp chuột, hãy sử dụng OnMarkerClickListener cục bộ:

@Override
public void onMapReady(GoogleMap googleMap) {
    // grab for laters
    this.googleMap = googleMap;

    googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(Marker marker) {
            Map dataModel = (Map)markers.get(marker);
            String title = (String)dataModel.get("title");
            markerOnClick(title);

            return false;
        }
    });

    mapView.onResume();

    showMarkers();

    ZoomAsync zoomAsync = new ZoomAsync();
    zoomAsync.execute();
}

Để hiển thị cửa sổ thông tin, hãy lấy mô hình dữ liệu gốc từ bản đồ đánh dấu:

@Override
public void onMapReady(GoogleMap googleMap) {
    this.googleMap = googleMap;
    googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
        @Override
        public void onInfoWindowClick(Marker marker) {
            Map dataModel = (Map)markers.get(marker);
            String title = (String)dataModel.get("title");

            infoWindowOnClick(title);
        }
    });

Hạn chế của việc triển khai OnMarkerClickListener là gì?
D.Rosado

@ D.Rosado OnMarkerClickListener dành cho khi điểm đánh dấu được nhấp, OnInfoWindowClickListener là khi cửa sổ thông tin được nhấp. Tôi có hiểu nhầm câu hỏi của bạn không? Triển khai từng dòng để giữ cho việc thực hiện bên trong cùng mã với setter.
Gary Davies

3

Giải pháp khác: bạn có được điểm đánh dấu theo tiêu đề của nó

public class MarkerDemoActivity extends android.support.v4.app.FragmentActivity implements OnMarkerClickListener
{
      private Marker myMarker;    

      private void setUpMap()
      {
      .......
      googleMap.setOnMarkerClickListener(this);

      myMarker = googleMap.addMarker(new MarkerOptions()
                  .position(latLng)
                  .title("My Spot")
                  .snippet("This is my spot!")
                  .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
      ......
      }

  @Override
  public boolean onMarkerClick(final Marker marker) 
  {

     String name= marker.getTitle();

      if (name.equalsIgnoreCase("My Spot")) 
      {
          //write your code here
      }
  }
}

2

Đây là toàn bộ mã của tôi về một hoạt động bản đồ với 4 điểm đánh dấu có thể nhấp. Nhấp vào điểm đánh dấu hiển thị cửa sổ thông tin và sau khi nhấp vào cửa sổ thông tin, bạn sẽ chuyển sang hoạt động khác: tiếng Anh, tiếng Đức, tiếng Tây Ban Nha hoặc tiếng Ý. Nếu bạn muốn sử dụng OnMarkerClickListener mặc dù OnInfoWindowClickListener, bạn chỉ cần trao đổi dòng này:

mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()

đến đây:

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener()

đường thẳng này:

public void onInfoWindowClick(Marker arg0)

đến đây:

public boolean onMarkerClick(Marker arg0)

và ở cuối phương thức "onMarkerClick":

return true;

Tôi nghĩ rằng nó có thể hữu ích cho ai đó;)

package pl.pollub.translator;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        Toast.makeText(this, "Choose a language.", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()
        {

            @Override
            public void onInfoWindowClick(Marker arg0) {
                if(arg0 != null && arg0.getTitle().equals("English")){
                Intent intent1 = new Intent(MapsActivity.this, English.class);
                startActivity(intent1);}

                if(arg0 != null && arg0.getTitle().equals("German")){
                Intent intent2 = new Intent(MapsActivity.this, German.class);
                startActivity(intent2);} 

                if(arg0 != null && arg0.getTitle().equals("Italian")){
                Intent intent3 = new Intent(MapsActivity.this, Italian.class);
                startActivity(intent3);}

                if(arg0 != null && arg0.getTitle().equals("Spanish")){
                Intent intent4 = new Intent(MapsActivity.this, Spanish.class);
                startActivity(intent4);}
            }
        });
        LatLng greatBritain = new LatLng(51.30, -0.07);
        LatLng germany = new LatLng(52.3107, 13.2430);
        LatLng italy = new LatLng(41.53, 12.29);
        LatLng spain = new LatLng(40.25, -3.41);
        mMap.addMarker(new MarkerOptions()
                .position(greatBritain)
                .title("English")
                .snippet("Click on me:)"));
        mMap.addMarker(new MarkerOptions()
                .position(germany)
                .title("German")
                .snippet("Click on me:)"));
        mMap.addMarker(new MarkerOptions()
                .position(italy)
                .title("Italian")
                .snippet("Click on me:)"));
        mMap.addMarker(new MarkerOptions()
                .position(spain)
                .title("Spanish")
                .snippet("Click on me:)"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(greatBritain));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(germany));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(italy));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(spain));
    }
}

1
trả về true nếu người nghe đã tiêu thụ sự kiện (nghĩa là hành vi mặc định sẽ không xảy ra); sai khác (nghĩa là hành vi mặc định sẽ xảy ra). Hành vi mặc định là để camera di chuyển đến điểm đánh dấu và cửa sổ thông tin sẽ xuất hiện.
Ariq

1
Step 1
public class TopAttractions extends Fragment implements OnMapReadyCallback, 
GoogleMap.OnMarkerClickListener

Step 2
gMap.setOnMarkerClickListener(this);

Step 3
@Override
public boolean onMarkerClick(Marker marker) {
    if(marker.getTitle().equals("sharm el-shek"))
        Toast.makeText(getActivity().getApplicationContext(), "Hamdy", Toast.LENGTH_SHORT).show();
    return false;
}

0

Tôi đã thêm một mMap.setOnMarkerClickListener(this);trong onMapReady(GoogleMap googleMap)phương thức. Vì vậy, mỗi khi bạn nhấp vào điểm đánh dấu, nó sẽ hiển thị tên văn bản trong phương thức bánh mì nướng.

public class DemoMapActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener,OnMapReadyCallback, GoogleMap.OnMarkerClickListener {

private GoogleMap mMap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_places);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    double lat=0.34924212701428;
    double lng=32.616554024713;
    String venue = "Capital Shoppers City";
    LatLng location = new LatLng(lat, lng);
    mMap.addMarker(new MarkerOptions().position(location).title(venue)).setTag(0);
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLng(location);
    CameraUpdate zoom = CameraUpdateFactory.zoomTo(16);
    mMap.moveCamera(cameraUpdate);
    mMap.animateCamera(zoom);
    mMap.setOnMarkerClickListener(this);
}

@Override
public boolean onMarkerClick(final Marker marker) {
    // Retrieve the data from the marker.
    Integer clickCount = (Integer) marker.getTag();

    // Check if a click count was set, then display the click count.
    if (clickCount != null) {
        clickCount = clickCount + 1;
        marker.setTag(clickCount);
        Toast.makeText(this,
                       marker.getTitle() +
                       " has been clicked ",
                       Toast.LENGTH_SHORT).show();
    }
    // Return false to indicate that we have not consumed the event and that we wish
    // for the default behavior to occur (which is for the camera to move such that the
    // marker is centered and for the marker's info window to open, if it has one).
    return false;
}

}

Bạn có thể kiểm tra liên kết này để đánh dấu tham khảo


-4

Tôi đã chỉnh sửa ví dụ nêu trên ...

public class YourActivity extends implements OnMarkerClickListener
{
    ......

    private void setMarker()
    {
        .......
        googleMap.setOnMarkerClickListener(this);

        myMarker = googleMap.addMarker(new MarkerOptions()
                    .position(latLng)
                    .title("My Spot")
                    .snippet("This is my spot!")
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
        ......
    }

    @Override
    public boolean onMarkerClick(Marker marker) {

       Toast.makeText(this,marker.getTitle(),Toast.LENGTH_LONG).show();
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.