点击Android中的谷歌地图标记?

时间:2016-08-25 13:43:53

标签: android google-maps android-fragments google-maps-api-3 android-maps

我有一个主要视图是谷歌地图的活动。我在最初加载地图时设置了一个标记,但是当我点击它时,我无法获得地点或任何东西。将显示地图,但我无法单击标记,或者点击或点击屏幕并按住以创建新标记。基本上它什么都做不了......我无法弄明白为什么!希望你们能看到我没看到的东西。

这是我的主要活动。

public class MapsActivity extends FragmentActivity {

    //Maps
    private GoogleMap mMap;
    //Marker
    private Marker marker;
    //Location
    private LocationListener locationListener = null;
    private LocationManager locationManager = null;
    private static final float DEFAULTZOOM = 15;
    private double longitude_mapsActivity;
    private double latitude_from_mapsActivity;
    private String cityName_mapsActivity;
    private String countryName_mapsActivity;
    //ProgressBar
    private ProgressBar myPB_MAPS;
    //Buttons
    private ImageButton fab_doneButton;

    //SearchEditText
    private EditText editText_Search;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        SupportMapFragment mapFragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                mMap = googleMap;
                LatLng sydney = new LatLng(-34, 151);
                mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
                mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
                mMap.animateCamera(CameraUpdateFactory.zoomTo(15), 2000, null);
            }
        });
        //Get user current location.
        //myPB_MAPS = (ProgressBar) findViewById(R.id.myPB_MAPS);

        //initialize your map
        initMap();

        //FAB button
        fab_doneButton = (ImageButton) findViewById(R.id.activity_maps_FAB_done);
        fab_doneButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (countryName_mapsActivity == null) {
                    Toast.makeText(MapsActivity.this, "Location is null", Toast.LENGTH_SHORT).show();
                } else {
                    Global_Class.getInstance().getValue().countryName_GLOBAL = countryName_mapsActivity;
                    Global_Class.getInstance().getValue().cityName_GLOBAL = cityName_mapsActivity;
                    Global_Class.getInstance().getValue().longitude_user_GLOBAL = longitude_mapsActivity;
                    Global_Class.getInstance().getValue().latitude_user_GLOBAL = latitude_from_mapsActivity;
                    //Go to make sure we're sending all the GPS info, so we set geoLocationFromMapsIsPresent to true.
                    FinishCard.geoLocationFromMapsIsPresent();
                    FinishCard.setComingBackFromMaps();
                    Intent FinishCardIntent = new Intent(MapsActivity.this, FinishCard.class);
                    startActivity(FinishCardIntent);
                }

            }
        });

        //EditText
        editText_Search = (EditText) findViewById(R.id.maps_EditText);
        editText_Search.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                    performSearch();
                    return true;
                }
                return false;
            }

        });




        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    }

    private void performSearch()
    {
        String location = editText_Search.getText().toString();
        if(location.length() == 0)
        {
            Toast.makeText(this,"Please enter a location",Toast.LENGTH_SHORT).show();
            return;
        }
        //1-first step
        Geocoder gc = new Geocoder(this);
        List<Address> list = null;//For this function I only want a single address.
        try
        {
            //3-Third step
            list = gc.getFromLocationName(location,10);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        //4-Fourth step
        Address add = list.get(0);//Give me the first and only item of the list.

        //5-fifth step
        String locality = add.getLocality();//So if you enter Taj mahal you get Agra, the place where its at, thats what Address locality does.
        double lat = add.getLatitude();
        double lng = add.getLongitude();

        //GoToLocation() method
        gotoLocation(lat, lng, DEFAULTZOOM);

        //For Removing existing markers.
        if(marker != null)
        {
            marker.remove();
        }

        MarkerOptions options = new MarkerOptions()
                .title(locality)
                .position(new LatLng(lat, lng))
                .draggable(true);
        marker =  mMap.addMarker(options);
    }

    private void gotoLocation(double lat, double lng, float zoom)
    {
        LatLng ll = new LatLng(lat,lng);
        CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, zoom);
        mMap.moveCamera(update);

    }

    private void setMarker(String locality, String country, double lat, double lng)
    {
        if(marker != null)
        {
            marker.remove();
        }
        MarkerOptions options = new MarkerOptions()
                .title(locality)
                .position(new LatLng(lat, lng))
                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE))
                .draggable(true);
        if(country.length() > 0)
        {
            options.snippet(country);//Background highlight TEXT SUPER IMPORTANT
        }
        //.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE));
        marker = mMap.addMarker(options);//So here we connect our marker to our map, which is used in initMap.

    }

    private void initMap()
    {
        if(mMap == null)
        {

            if(mMap != null)
            {
                mMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener()
                {
                    @Override
                    public void onMapLongClick(LatLng ll) {
                        Geocoder gc = new Geocoder(MapsActivity.this);
                        List<Address> list = null;
                        try {
                            list = gc.getFromLocation(ll.latitude, ll.longitude, 1);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                        Address add = list.get(0);
                        MapsActivity.this.setMarker(add.getLocality(), add.getCountryName(), ll.latitude, ll.longitude);//this is where we set the orange marker.
                        latitude_from_mapsActivity= ll.latitude;
                        longitude_mapsActivity= ll.longitude;
                        countryName_mapsActivity = add.getCountryName();
                        cityName_mapsActivity = add.getLocality();
                    }
                });

                mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                    @Override
                    public boolean onMarkerClick(Marker marker)
                    {
                        LatLng ll = marker.getPosition();
                        latitude_from_mapsActivity= ll.latitude;
                        longitude_mapsActivity = ll.longitude;
                        Geocoder gc = new Geocoder(MapsActivity.this);
                        //Global_Class.getInstance().getValue().cardLocality = "Paris";
                        List<Address> list = null;
                        try
                        {
                            list = gc.getFromLocation(ll.latitude, ll.longitude,1);

                        }
                        catch (IOException e)
                        {
                            e.printStackTrace();
                        }
                        try
                        {
                            Address add = list.get(0);
                            countryName_mapsActivity = add.getCountryName();
                            cityName_mapsActivity = add.getLocality();
                            return false;

                        }
                        catch (IndexOutOfBoundsException e)
                        {
                            return false;
                        }


                    }
                });

                mMap.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() //If you want to drag the original google maps marker you use this method, if you comment this out it will use the orange one.
                {
                    @Override
                    public void onMarkerDragStart(Marker marker) {

                    }

                    @Override
                    public void onMarkerDrag(Marker marker) {

                    }

                    @Override
                    public void onMarkerDragEnd(Marker marker) {
                        Geocoder gc = new Geocoder(MapsActivity.this);
                        List<Address> list = null;
                        LatLng ll = marker.getPosition();
                        try {
                            list = gc.getFromLocation(ll.latitude, ll.longitude, 1);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                        Address add = list.get(0);
                        marker.setTitle(add.getLocality());
                        marker.setSnippet(add.getCountryName());
                        //marker.showInfoWindow();
                    }
                });
            }
        }
    }
}

这是我的xml

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.daprlabs.swipedeck.GeoLocation.MapsActivity">


    <RelativeLayout
        android:layout_width="340dp"
        android:layout_height="50dp"
        android:background="#FFFFFF"
        android:elevation="10sp"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp">

        <EditText
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:id="@+id/maps_EditText"
            android:imeOptions="actionSearch"
            android:inputType="text"/>
    </RelativeLayout>

    <ProgressBar
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:id="@+id/myPB_MAPS"
        android:layout_marginLeft="150dp"
        android:layout_marginTop="55dp"/>

    <ImageButton
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:background="@drawable/circle_fab"
        android:id="@+id/activity_maps_FAB_done"
        android:layout_gravity="right|bottom"
        android:src="@drawable/white_plus" />


</fragment>

2 个答案:

答案 0 :(得分:0)

你在initMap()中自相矛盾。

删除以下if语句:

if (mMap == null)

同样只在initMap()返回后调用mapFragment.getMapAsync。此时,您知道您的地图已准备就绪。

    mapFragment.getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(GoogleMap googleMap) {
            mMap = googleMap;
            LatLng sydney = new LatLng(-34, 151);
            mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
            mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
            mMap.animateCamera(CameraUpdateFactory.zoomTo(15), 2000, null);
            initMap();
        }
    });

答案 1 :(得分:0)

你应该实施

  

OnMapReadyCallback

反过来覆盖

  

onMapReady

现在您可以在onMapReady中操作Map。在此之前,您无法确定您的地图是否已正确设置。

操作Map的任何操作都需要在onMapReady上进行操作,例如在其上加载标记和设置标记点击侦听器。

作为Map在适当时间进行操作的示例,您可以从以下代码中获取提示,其中仅在正确设置了Map的相机时设置。

    public class YourMapFragment extends Fragment implements OnMapReadyCallback { 
...
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(currentPosition,16));

    mMap.addMarker(new MarkerOptions()
            .position(currentPosition)
            .snippet("Lat:" + lat + "Lng:" + log));
}

    ...
    }