Google मानचित्र API v2: मार्कर को क्लिक करने योग्य कैसे बनाया जाए?


128

मैं एंड्रॉइड में मार्कर कैसे बना सकता हूं Google मैप्स एपीआई v2 क्लिक करने योग्य हो जाते हैं इसलिए वे या तो विकल्पों के साथ एक मेनू लाएंगे या बस एक नई गतिविधि शुरू करेंगे? मुझे विश्वास है कि मैंने अपने ऐप में मार्करों को वर्तमान में "newb" विधि में बनाया है। मैंने उन्हें आवश्यक कोड के बाकी हिस्सों के साथ लिंक करने में सक्षम होने के लिए एक नाम या एक विधि प्रदान नहीं की।

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

यदि आप इसे पसंद करते हैं, तो कृपया एक अद्वितीय नाम के साथ पेश किए जा रहे मार्कर का एक नमूना कोड शामिल करें और फिर एक नई गतिविधि खोलने के लिए क्लिक करने योग्य के रूप में सेट किया जा रहा है।

जवाबों:


238

Google Android मैप्स Api v2 में सभी मार्कर क्लिक करने योग्य हैं। आपको अपने मार्कर पर कोई अतिरिक्त गुण सेट करने की आवश्यकता नहीं है। आपको क्या करने की आवश्यकता है - अपने googleMap पर मार्कर क्लिक कॉलबैक रजिस्टर करना है और कॉलबैक के भीतर क्लिक हैंडल करना है:

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

यहाँ मार्कर अनुकूलन के बारे में गूगल पर एक अच्छी गाइड है


9
क्या पॉपअप विंडो पर क्लिक सुनने का कोई तरीका है? वह जो आपके शीर्षक / स्निपेट को प्रदर्शित करता है?

40
मार्करों के साथ एक ही बात - आपको पंजीकरण करने की आवश्यकता है OnInfoWindowClickListenerCallback। इसके लिए GoogleMap में एक विधि है:googleMap.setOnInfoWindowClickListener(listener);
पावेल दुदका

यह अब के लिए बहुत ठीक काम कर रहा है, मैंने देखा कि मेरी गलती कोड में पहले एक चर के रूप में इसे स्थापित नहीं कर रही थी। मैं बस भूल गया ";" और कार्यान्वित कोड
मलाका

1
यदि आप अलग-अलग मार्करों के लिए अलग तर्क रखते हैं तो @JDOaktown को इस चेक की आवश्यकता है। कहते हैं कि आप केवल एक टोस्ट दिखाना चाहते हैं जब विशिष्ट मार्कर पर क्लिक किया जाता है। यदि आपके पास अपने सभी मार्करों के लिए एक ही हैंडलिंग लॉजिक है - तो आपको मार्कर की जांच करने की आवश्यकता नहीं है
पावेल दुदका

1
जैसा कि दस्तावेज़ीकरण में उल्लेख किया गया है ( Developers.google.com/android/reference/com/google/android/gms/… ), अगर आपको क्लिक का उपभोग करना पड़ा, तो आपको वापस लौटना होगा। यदि आप झूठे लौटते हैं - डिफ़ॉल्ट व्यवहार घटित होगा
Pavel Dudka

36

setTag(position) मानचित्र में मार्कर जोड़ते समय।

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

getTag()setOnMarkerClickListenerश्रोता पर

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

गतिविधि का उपयोग करने से बचें OnMarkerClickListener, स्थानीय OnMarkerClickListener का उपयोग करें

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

आपको मार्कर से जुड़े मूल डेटा मॉडल को देखने के लिए मानचित्र की आवश्यकता होगी

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

आपको एक डेटा मॉडल की आवश्यकता होगी

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

डेटा मॉडल में कुछ डेटा डालें

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

डेटा मॉडल का उपयोग करके एक नया मार्कर बनाते समय दोनों को निर्माता के नक्शे में जोड़ें

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

क्लिक मार्कर घटना के लिए, एक स्थानीय OnMarkerClickListener का उपयोग करें:

@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();
}

जानकारी विंडो प्रदर्शित करने के लिए मार्कर मैप से मूल डेटा मॉडल को पुनः प्राप्त करें:

@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);
        }
    });

OnMarkerClickListener को लागू करने की कमियां क्या हैं?
डी। रोराडो

@ D.Rosado OnMarkerClickListener जब मार्कर पर क्लिक किया जाता है, तो OnInfoWindowClickListener जब सूचना विंडो पर क्लिक किया जाता है। क्या मैं आपके प्रश्न को गलत समझ रहा हूं? सेटर के समान कोड के अंदर कार्यान्वयन को बनाए रखने के लिए प्रत्येक इनलाइन को लागू करें।
गैरी डेविस

3

एक अन्य समाधान: आप मार्कर को इसके शीर्षक से प्राप्त करते हैं

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

यहाँ 4 क्लिक करने योग्य मार्कर के साथ मानचित्र गतिविधि का मेरा पूरा कोड है। एक मार्कर पर क्लिक करें एक सूचना विंडो दिखाता है, और जानकारी विंडो पर क्लिक करने के बाद आप किसी अन्य गतिविधि पर जा रहे हैं: अंग्रेजी, जर्मन, स्पेनिश या इतालवी। यदि आप OnInfoWindowClickListener के बावजूद OnMarkerClickListener का उपयोग करना चाहते हैं, तो आपको बस इस लाइन को स्वैप करना होगा:

mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()

इसके लिए:

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener()

यह रेखा:

public void onInfoWindowClick(Marker arg0)

इसके लिए:

public boolean onMarkerClick(Marker arg0)

और विधि के अंत में "onMarkerClick":

return true;

मुझे लगता है कि यह किसी के लिए उपयोगी हो सकता है;)

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
यदि श्रोता ने ईवेंट का उपभोग कर लिया है (तो, डिफ़ॉल्ट व्यवहार नहीं होना चाहिए); गलत अन्यथा (यानी, डिफ़ॉल्ट व्यवहार होना चाहिए)। डिफॉल्ट व्यवहार कैमरा के लिए मार्कर तक ले जाने के लिए है और एक सूचना विंडो दिखाई देने के लिए है।
अरीक

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

मैंने विधि mMap.setOnMarkerClickListener(this);में एक जोड़ा onMapReady(GoogleMap googleMap)। इसलिए हर बार जब आप किसी मार्कर पर क्लिक करते हैं तो यह टेक्स्ट नाम को टोस्ट विधि में प्रदर्शित करता है।

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;
}

}

आप इस लिंक को संदर्भ मार्कर के लिए जाँच सकते हैं


-4

मैंने ऊपर दिए गए उदाहरण को संपादित किया है ...

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();
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.