2013-09-05 8 views
7

प्रतिसाद नहीं दे रहा है जब मैं मानचित्र पर क्लिक करता हूं तो मैं मार्कर लगाने की कोशिश कर रहा हूं। मैं SupportMapFragment का उपयोग ActionBarActivity के अंदर कर रहा हूं। लेकिन नक्शा प्रतिक्रिया नहीं देता है, इसके अलावा, map.setMapType() ऑपरेशन काम नहीं कर रहा है।एंड्रॉइड Google मैप्स v2: क्लिक श्रोता पर

यहाँ मेरी कोड है:

private GoogleMap map; 
private Marker marker; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    ActionBarActivity activity = (ActionBarActivity) getActivity(); 
    activity.getSupportActionBar().setTitle(R.string.select_location); 
    super.onCreateView(inflater, container, savedInstanceState); 
    return inflater.inflate(R.layout.map, container, false); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    Log.d("Map","On view created"); 
    map = getMap(); 
      map.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 
    map.setOnMapClickListener(new OnMapClickListener() { 

     @Override 
     public void onMapClick(LatLng point) { 
      Log.d("Map","Map clicked"); 
      marker.remove(); 
      drawMarker(point); 
     } 
    }); 

     ... 
     Location location = locationManager.getLastKnownLocation(provider); 

     if(location!=null){ 
      //PLACE THE INITIAL MARKER    
      drawMarker(new LatLng(location.getLatitude(),location.getLongitude())); 
     } 
} 

Logcat संदेश "दृश्य पर बनाया" दिखा रहा है और मानचित्र एक मार्कर के साथ वर्तमान स्थान से पता चलता है, तो कोड के अंतिम भाग निष्पादित किया जा रहा है। लेकिन onMapClickListener ओवरराइड या कुछ है क्योंकि यह काम नहीं करता है, और नक्शा उपग्रह नहीं है।

किसी को भी मेरी मदद कर सकते हैं?

उत्तर

15

आप SupportMapFragment बढ़ाया है तो आप बस यह कर सकते हैं:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    ActionBarActivity activity = (ActionBarActivity) getActivity(); 
    activity.getSupportActionBar().setTitle(R.string.select_location); 
    return super.onCreateView(inflater, container, savedInstanceState); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    map = getMap(); 
    map.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 
    map.setOnMapClickListener(new OnMapClickListener() { 

    @Override 
    public void onMapClick(LatLng point) { 
     Log.d("Map","Map clicked"); 
     marker.remove(); 
     drawMarker(point); 
    } 
}); 

ध्यान दें कि getMap() onActivityCreated में कहा जाता है और आप एक कस्टम लेआउट का उपयोग नहीं है अगर inflater.inflate(R.layout.map, container, false) आवश्यक नहीं है।

आपको map.xml लेआउट की भी आवश्यकता नहीं है!

आप SupportMapFragment बढ़ा रहे हैं लेकिन आप किसी अन्य MapView (डिफ़ॉल्ट रूप से SupportMapFragment से बंधा नहीं एक) बढ़ा-चढ़ाकर कर रहे हैं, यही कारण है कि आप अपने नक्शे में परिवर्तन से नहीं देख रहे यही। क्योंकि आप डिफ़ॉल्ट View पर काम कर रहे थे getMap() से मिले लेकिन आप एक और देख रहे हैं।

public final GoogleMap getMap() 

अंतर्निहित GoogleMap दृश्य इस टुकड़ा द्वारा लिपटे से जुड़ा हुआ है कि हो जाता है: docs about getMap() देखें।

आशा है कि यह मदद करता है;)

+0

धन्यवाद josuadas! मुद्दा यह है कि मुझे एक एक्सएमएल बढ़ाने की जरूरत है क्योंकि यह सिर्फ एक मानचित्र के साथ एक दृश्य नहीं है। मुझे लगता है कि SupportMapFragment को विस्तारित करना अभी भी स्वीकार्य है, है ना? –

+0

ईज़ horregatik! मेरी राय में आपको उस मामले में SupportMapFragment का विस्तार नहीं करना चाहिए, बल्कि केवल टुकड़ा (समर्थन लाइब्रेरी से)। यह लिंक देखें: http://stackoverflow.com/questions/13804511/supportmapfragment-with-a- कस्टम-layout- संभावित – josuadas

+0

एक और संभावना है कि मैग के लिए स्थान लेना केवल FragmentActivity में SupportMapFragment को जोड़ना है। F.i. अपने FragmentActivity लेआउट में कंटेनर के रूप में फ़्रेमलेआउट का उपयोग करके: http://developer.android.com/training/basics/fragments/fragment-ui.html#AddAtRuntime – josuadas

1
इसके बजाय नक्शा करने का

= getMap(), कुछ लाइनें बाद में मैं इस कोड था:

 SupportMapFragment fm = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map); 
     map = fm.getMap(); 

तो मैं सिर्फ इतना है कि रेखा से ऊपर कोड डाल दिया है और यह किया है।

+0

हाय जॉन!मुझे लगता है कि आप एक आसान तरीके से कर सकते हैं, क्योंकि आप पहले से ही SupportMapFragment में हैं, फ्रैगमेंट प्राप्त करना आवश्यक नहीं है (जब आप फ्रैगमेंट एक्टिविटी से कॉल करते हैं तो यह उपयोगी होता है)। मैंने एक जवाब जोड़ा। – josuadas

0

इसके बजाय नक्शा करने का = getMap() आप इस कोशिश कर सकते हैं।

if (map == null) { 
    // Try to obtain the map from the SupportMapFragment. 
    this.map = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.mapView)) 
     .getMap(); 
    setUpMap(lat, longi, R.drawable.marker2, title); 
} 

private void setUpMap(double lat, double lng, int drawableResource, String title) { 
    if(map != null) { 
     marker = map.addMarker(new MarkerOptions().position(new LatLng(lat, lng)) 
       .title(title) 
       .icon(BitmapDescriptorFactory.fromResource(drawableResource))); 
     geocoder = new Geocoder(this, Locale.getDefault()); 
     map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 15)); 
     map.animateCamera(CameraUpdateFactory.zoomTo(13), 2500, null); 
    } 
} 
2

वैसे आप अपने नक्शे के लिए एक श्रोता दे रहे हैं, लेकिन आप अपने मार्करों के लिए एक श्रोता बनाने की जरूरत है।

map.setOnMarkerClickListener(this); 

... 

@Override 
public boolean onMarkerClick(Marker arg0) {  
    Log.i(TAG,"marker arg0 = "+arg0);    
    return false; 
} 

या मार्कर के शीर्ष पर InfoWindows के लिए:

map.setOnInfoWindowClickListener(this); 

इसके अलावा, यह उपग्रह दिखाने बनाने नक्शे के अपने initialitizing लगभग सही है:

map.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 

यह परिवर्तन प्रति:

map.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
संबंधित मुद्दे