如何修復谷歌地圖上的標記並移動地圖? (How to fix marker on google map and move map?)


問題描述

如何修復谷歌地圖上的標記並移動地圖? (How to fix marker on google map and move map?)

我已經在谷歌地圖上顯示了當前位置,但我想在選擇“autoPlace 城市”時將標記固定在地圖中心,然後這個位置會顯示在谷歌地圖上。

我的代碼如下:

public class PostAdsFragmentFifth extends Fragment implements View.OnClickListener,  GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

private static final String TAG = PostAdsFragmentFifth.class.getSimpleName();
private CustomTextView tvBackBtn;
PlaceAutocompleteFragment autocompleteFragment;
private GoogleMap mMap;
Address address;
protected GoogleApiClient mGoogleApiClient;
private Marker marker;
private SupportMapFragment mapFragment;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_post_slide5, container, false);
    checkGpsEnabled();
    setGooglePlaces();
    mapFragment = (SupportMapFragment) this.getChildFragmentManager()
            .findFragmentById(R.id.map);
    tvBackBtn = (CustomTextView) getActivity().findViewById(R.id.tvBack);
    tvBackBtn.setVisibility(View.VISIBLE);
    tvBackBtn.setOnClickListener(this);
    return view;
}


@Override
public void onStart() {
    super.onStart();
    checkPermissions();

}

@Override
public void onDestroy() {
    super.onDestroy();
    if (mGoogleApiClient != null)
        mGoogleApiClient.disconnect();
}

@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.tvBack:
            MixPanelEvents.addMixPanelEvents(getActivity(), "Pet Address for Back");

            if (getUserVisibleHint())
                ((PostAdsActivity) getActivity()).gotoNext(4);
            break;

    }
}

private void setGooglePlaces() {
    autocompleteFragment = (PlaceAutocompleteFragment) getActivity().getFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);
    autocompleteFragment.setHint(getResources().getString(R.string.address_hint_toast));

    AutocompleteFilter typeFilter = new AutocompleteFilter.Builder()
            .setTypeFilter(AutocompleteFilter.TYPE_FILTER_ADDRESS)
            .build();
    autocompleteFragment.setFilter(typeFilter);

    autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {

            address = new Address();
            address.setLatitude(place.getLatLng().latitude);
            address.setLongitude(place.getLatLng().longitude);
            address.setAddress(place.getAddress().toString());
            address.setLandmark(place.getName().toString());
            PostAdsActivity.postData.setAddress(address);

        }

        @Override
        public void onError(Status status) {
            // TODO: Handle the error.
            LogUtils.i(TAG, "An error occurred: " + status);
        }
    });
}


protected synchronized void buildGoogleApiClient() {
    mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
            .addConnectionCallbacks(this)
            .addApi(LocationServices.API)
            .addApi(Places.GEO_DATA_API)
            .addApi(Places.PLACE_DETECTION_API)
            .build();
    mGoogleApiClient.connect();
}


@Override
public void onConnected(Bundle bundle) {
    Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    if (mLastLocation != null) {
        double lat = mLastLocation.getLatitude();
        double lng = mLastLocation.getLongitude();
        if (lat != 0 && lng != 0) {
            mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 16.0f));
            convertLocationToAddress(new LatLng(lat, lng));
            if (marker != null) {
                MarkerOptions markerOptions = new MarkerOptions().position(new LatLng(lat, lng));
                marker = mMap.addMarker(markerOptions);
            }
        }

    }
}

private void checkPermissions() {
    if (Build.VERSION.SDK_INT >= 23 && getActivity().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            && getActivity().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ArrayList<String> permissons = new ArrayList<>();
        permissons.add(Manifest.permission.ACCESS_FINE_LOCATION);
        permissons.add(Manifest.permission.ACCESS_COARSE_LOCATION);
        String[] items = permissons.toArray(new String[permissons.size()]);
        requestPermissions(items, 4);
    } else {
        mapFragment.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                mMap = googleMap;
                setUpMap();
                buildGoogleApiClient();
            }
        });
    }
}

private void setUpMap() {
    if (Utility.isAppInstalled(getActivity(), "com.google.android.apps.maps")) {
        mMap.setMyLocationEnabled(true);

        mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {

                LatLng currentLocation = marker.getPosition();
                convertLocationToAddress(currentLocation);
                return false;
            }
        });
        mMap.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() {

            @Override
            public void onMarkerDragStart(Marker marker) {

            }

            @Override
            public void onMarkerDragEnd(Marker marker) {
                LatLng currentLocation = marker.getPosition();
                convertLocationToAddress(currentLocation);
            }

            @Override
            public void onMarkerDrag(Marker marker) {
            }
        });

        mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
            @Override
            public void onMapLoaded() {

                LogUtils.e("TAG", mMap.getCameraPosition().target.toString());
                convertLocationToAddress(mMap.getCameraPosition().target);
                marker = mMap.addMarker(new MarkerOptions()
                        .position(new LatLng(mMap.getCameraPosition().target.latitude, mMap.getCameraPosition().target.longitude))
                        .title("Marker")
                        .draggable(true)
                        .snippet("Location")
                        .icon(BitmapDescriptorFactory
                                .defaultMarker(BitmapDescriptorFactory.HUE_RED)));
            }
        });


    }
}


@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 4) {
        for (int a = 0; a < permissions.length; a++) {
            if (grantResults[a] != PackageManager.PERMISSION_GRANTED) {
                continue;
            }
            switch (permissions[a]) {
                case Manifest.permission.ACCESS_FINE_LOCATION:
                    mapFragment.getMapAsync(new OnMapReadyCallback() {
                        @Override
                        public void onMapReady(GoogleMap googleMap) {
                            mMap = googleMap;
                            setUpMap();
                            buildGoogleApiClient();
                        }
                    });
                    break;
                case Manifest.permission.ACCESS_COARSE_LOCATION:
                    mapFragment.getMapAsync(new OnMapReadyCallback() {
                        @Override
                        public void onMapReady(GoogleMap googleMap) {
                            mMap = googleMap;
                            setUpMap();
                            buildGoogleApiClient();
                        }
                    });
                    break;

            }
        }
    }
}

private void convertLocationToAddress(LatLng latLong) {
    try {

        Geocoder geocoder;
        List<android.location.Address> addresses;
        geocoder = new Geocoder(getActivity(), Locale.getDefault());
        addresses = geocoder.getFromLocation(latLong.latitude, latLong.longitude, 1);

        LogUtils.d("Address", addresses.toString());
        /*address.setAddress(addresses.get(0).getAddressLine(0));
        if (addresses.get(0).getLocality() != null) {
            address.setCity(addresses.get(0).getLocality());
        } else {
            address.setCity("");
        }
        if (addresses.get(0).getAdminArea() != null) {
            address.setState(addresses.get(0).getAdminArea());
        } else {
            address.setState("");
        }
        address.setLatitude(latLong.latitude);
        address.setLongitude(latLong.longitude);
        if (addresses.get(0).getPostalCode() != null) {
            // address.setPinCode(addresses.get(0).getPostalCode());
        }*/


    } catch (Exception e) {
        e.printStackTrace();
    }
}
private void checkGpsEnabled() {
    LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
    boolean gps_enabled = false;
    boolean network_enabled = false;
    try {
        gps_enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        network_enabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        if (!gps_enabled && !network_enabled) {
            AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity());
            dialog.setTitle(getResources().getString(R.string.location_gps_alretDialog_tittle));
            dialog.setMessage(getResources().getString(R.string.location_gps_alretDialog_msg));
            dialog.setPositiveButton(this.getResources().getString(R.string.yes), new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                    MixPanelEvents.addMixPanelEvents(getActivity(), getResources().getString(R.string.location_gps_alretDialog_tittle));
                    Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    startActivityForResult(myIntent, 1);
                }
            });
            dialog.setNegativeButton(this.getString(R.string.no), new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                    paramDialogInterface.dismiss();
                }
            });
            dialog.show();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

}
}

參考解法

方法 1:

Why don't you add your marker as a view and overlay it on top of the map. Your layout file can look like this:

<?xml version="1.0" encoding="utf‑8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/map_container"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

  <fragment 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.example.mapstest.MapsActivity" />

  <FrameLayout
      android:id="@+id/pin_view"
      android:layout_gravity="center"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:background="@drawable/pin"/>

</FrameLayout>

and later set this way

public void moveCamera(double lat, double lng) {
    CameraPosition cameraPos = new CameraPosition.Builder()
            .target(new LatLng(lat, lng))
            .zoom(10).bearing(0).tilt(0).build();
    mapView.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPos), null);
}

or if your using a MapFragment add the marker to the fragment activity

check this :

android How to move a map under a marker

(by Dinesh Varma460)

參考文件

  1. How to fix marker on google map and move map? (CC BY‑SA 2.5/3.0/4.0)

#google-latitude #java #javascript #Android #google-maps






相關問題

Otentikasi permanen Google Latitude API untuk akun tertentu (Google Latitude API permanent auth for specific account)

無法從 Google Apps 腳本連接到 Google Latitude API (Can't connect to Google Latitude API from Google Apps Script)

如何在谷歌地圖API中獲取高速公路和道路的緯度和經度 (How to get Latitude and Longitude of highways and roads in Google maps API)

如何修復谷歌地圖上的標記並移動地圖? (How to fix marker on google map and move map?)

使用 Google Latitude API 獲取朋友的位置 (Using Google Latitude API to get friends' locations)

尋找我和朋友之間最近的距離 (Finding nearest distance between me and friends)







留言討論