检查已经点击了哪个标记 - 显示对话框信息

如同标注。我正在寻找一些解决方案。另一方面,我想要实现的是在Google地图上显示整个标记,点击其中一个之后,我需要做的就是显示alertdialog或对话框中的一些特定信息。但我不知道如何定义哪些被点击。检查已经点击了哪个标记 - 显示对话框信息

这是我的GoogleMap类。希望举一些例子。真的需要实现..

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener, GoogleMap.OnMarkerClickListener { 

private GoogleMap mMap;

private static final String TAG = MapsActivity.class.getSimpleName();

LocationManager locationManager;

LocationRequest mLocationRequest;

GoogleApiClient mGoogleApiClient;

Location mLastLocation;

Marker mCurrLocationMarker;

Button logoutButton;

TextView time_text;

TextView distance_text;

private FirebaseAuth.AuthStateListener mAuthListener;

private FirebaseAuth mAuth;

private GoogleSignInClient mGoogleSignInClient;

private CalculateDistanceTime distance_task;

private Marker marker1;

private Marker marker2;

boolean isSecond = false;

Polyline lastPolyline;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

View decor_View = getWindow().getDecorView();

int ui_Options = View.SYSTEM_UI_FLAG_LAYOUT_STABLE

| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION

| View.SYSTEM_UI_FLAG_FULLSCREEN

| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;

decor_View.setSystemUiVisibility(ui_Options);

UiChangeListener();

setContentView(R.layout.activity_maps);

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

SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()

.findFragmentById(R.id.map);

mapFragment.getMapAsync(this);

mAuth = FirebaseAuth.getInstance();

logoutButton = (Button) findViewById(R.id.logoutButton);

time_text = (TextView) findViewById(R.id.time_text);

distance_text = (TextView) findViewById(R.id.distance_text);

logoutButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

signOut();

Intent intent = new Intent(MapsActivity.this, SignInActivity.class);

startActivity(intent);

finish();

}

});

mAuth = FirebaseAuth.getInstance();

mAuthListener = new FirebaseAuth.AuthStateListener() {

@Override

public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

if (firebaseAuth.getCurrentUser() == null) {

startActivity(new Intent(MapsActivity.this, SignInActivity.class));

}

}

};

distance_task = new CalculateDistanceTime(this);

Polyline lastpolyline;

}

@Override

protected void onPause() {

super.onPause();

if (mGoogleApiClient != null) {

LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);

}

}

private void signOut() {

mAuth.signOut();

}

/**

* Manipulates the map once available.

* This callback is triggered when the map is ready to be used.

* This is where we can add markers or lines, add listeners or move the camera. In this case,

* we just add a marker near Sydney, Australia.

* If Google Play services is not installed on the device, the user will be prompted to install

* it inside the SupportMapFragment. This method will only be triggered once the user has

* installed Google Play services and returned to the app.

*/

@Override

public void onMapReady(GoogleMap googleMap) {

mMap = googleMap;

mMap.getUiSettings().setMapToolbarEnabled(false);

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

if (ContextCompat.checkSelfPermission(this,

Manifest.permission.ACCESS_FINE_LOCATION)

== PackageManager.PERMISSION_GRANTED) {

//Location Permission already granted

buildGoogleApiClient();

mMap.setMyLocationEnabled(true);

} else {

//Request Location Permission

checkLocationPermission();

}

} else {

buildGoogleApiClient();

mMap.setMyLocationEnabled(true);

}

try {

// Customise the styling of the base map using a JSON object defined

// in a raw resource file.

boolean success = googleMap.setMapStyle(

MapStyleOptions.loadRawResourceStyle(

this, R.raw.custom_google_map));

if (!success) {

Log.e(TAG, "Style parsing failed.");

}

} catch (Resources.NotFoundException e) {

Log.e(TAG, "Can't find style. Error: ", e);

}

if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

// TODO: Consider calling

// ActivityCompat#requestPermissions

// here to request the missing permissions, and then overriding

// public void onRequestPermissionsResult(int requestCode, String[] permissions,

// int[] grantResults)

// to handle the case where the user grants the permission. See the documentation

// for ActivityCompat#requestPermissions for more details.

return;

}

marker1 = mMap.addMarker(new MarkerOptions()

.position(new LatLng(51.1117744, 17.0353596))

.title("Giselle French Bakery Cafe")

.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));

mMap.setOnMarkerClickListener(this);

}

protected synchronized void buildGoogleApiClient() {

mGoogleApiClient = new GoogleApiClient.Builder(this)

.addConnectionCallbacks(this)

.addOnConnectionFailedListener(this)

.addApi(LocationServices.API)

.build();

mGoogleApiClient.connect();

}

@Override

public void onConnected(@Nullable Bundle bundle) {

mLocationRequest = new LocationRequest();

mLocationRequest.setInterval(30 * 1000);

mLocationRequest.setFastestInterval(30 * 1000);

mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

if (ContextCompat.checkSelfPermission(this,

Manifest.permission.ACCESS_FINE_LOCATION)

== PackageManager.PERMISSION_GRANTED) {

LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

}

}

@Override

public void onConnectionSuspended(int i) {

}

@Override

public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

@Override

public void onLocationChanged(Location location) {

mLastLocation = location;

if (mCurrLocationMarker != null) {

mCurrLocationMarker.remove();

}

//Place current location marker

LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());

MarkerOptions markerOptions = new MarkerOptions();

markerOptions.position(latLng);

markerOptions.title("You are here");

markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE));

mCurrLocationMarker = mMap.addMarker(markerOptions);

//move map camera

mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 16));

}

public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;

private void checkLocationPermission() {

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)

!= PackageManager.PERMISSION_GRANTED) {

// Should we show an explanation?

if (ActivityCompat.shouldShowRequestPermissionRationale(this,

Manifest.permission.ACCESS_FINE_LOCATION)) {

// Show an explanation to the user *asynchronously* -- don't block

// this thread waiting for the user's response! After the user

// sees the explanation, try again to request the permission.

new AlertDialog.Builder(this)

.setTitle("Location Permission Needed")

.setMessage("This app needs the Location permission, please accept to use location functionality")

.setPositiveButton("OK", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialogInterface, int i) {

//Prompt the user once explanation has been shown

ActivityCompat.requestPermissions(MapsActivity.this,

new String[]{Manifest.permission.ACCESS_FINE_LOCATION},

MY_PERMISSIONS_REQUEST_LOCATION);

}

})

.create()

.show();

} else {

// No explanation needed, we can request the permission.

ActivityCompat.requestPermissions(this,

new String[]{Manifest.permission.ACCESS_FINE_LOCATION},

MY_PERMISSIONS_REQUEST_LOCATION);

}

}

}

@Override

public void onRequestPermissionsResult(int requestCode,

String permissions[], int[] grantResults) {

switch (requestCode) {

case MY_PERMISSIONS_REQUEST_LOCATION: {

// If request is cancelled, the result arrays are empty.

if (grantResults.length > 0

&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {

// permission was granted, yay! Do the

// location-related task you need to do.

if (ContextCompat.checkSelfPermission(this,

Manifest.permission.ACCESS_FINE_LOCATION)

== PackageManager.PERMISSION_GRANTED) {

if (mGoogleApiClient == null) {

buildGoogleApiClient();

}

mMap.setMyLocationEnabled(true);

}

} else {

// permission denied, boo! Disable the

// functionality that depends on this permission.

Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show();

}

return;

}

// other 'case' lines to check for other

// permissions this app might request

}

}

public void UiChangeListener() {

final View decorView = getWindow().getDecorView();

decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {

@Override

public void onSystemUiVisibilityChange(int visibility) {

if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {

decorView.setSystemUiVisibility(

View.SYSTEM_UI_FLAG_LAYOUT_STABLE

| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION

| View.SYSTEM_UI_FLAG_FULLSCREEN

| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

}

}

});

}

private String getDirectionsUrl(LatLng origin, LatLng dest) {

String str_origin = "origin=" + origin.latitude + "," + origin.longitude;

String str_dest = "destination=" + dest.latitude + "," + dest.longitude;

String sensor = "sensor=false";

String parameters = str_origin + "&" + str_dest + "&" + sensor;

String output = "json";

return "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters;

}

public static String downloadUrl(String strUrl) throws IOException {

String data = "";

HttpURLConnection urlConnection;

URL url = new URL(strUrl);

// Creating an http connection to communicate with url

urlConnection = (HttpURLConnection) url.openConnection();

// Connecting to url

urlConnection.connect();

// Reading data from url

try (InputStream iStream = urlConnection.getInputStream()) {

BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

StringBuilder sb = new StringBuilder();

String line;

while ((line = br.readLine()) != null) {

sb.append(line);

}

data = sb.toString();

br.close();

} catch (Exception e) {

Log.d("Exception while down", e.toString());

} finally {

urlConnection.disconnect();

}

return data;

}

private class DownloadTask extends AsyncTask<String, Void, String> {

// Downloading data in non-ui thread

@Override

protected String doInBackground(String... url) {

// For storing data from web service

String data = "";

try {

// Fetching the data from web service

data = downloadUrl(url[0]);

} catch (Exception e) {

Log.d("Background Task", e.toString());

}

return data;

}

// Executes in UI thread, after the execution of

// doInBackground()

@Override

protected void onPostExecute(String result) {

super.onPostExecute(result);

ParserTask parserTask = new ParserTask();

// Invokes the thread for parsing the JSON data

parserTask.execute(result);

}

}

private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {

@Override

protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {

JSONObject jObject;

List<List<HashMap<String, String>>> routes = null;

try {

jObject = new JSONObject(jsonData[0]);

DirectionsJSONParser parser = new DirectionsJSONParser();

// Starts parsing data

routes = parser.parse(jObject);

} catch (Exception e) {

e.printStackTrace();

}

return routes;

}

@Override

protected void onPostExecute(List<List<HashMap<String, String>>> result) {

for (int i = 0; i < result.size(); i++) {

ArrayList<LatLng> points = new ArrayList<>();

PolylineOptions lineOptions = new PolylineOptions();

List<HashMap<String, String>> path = result.get(i);

for (int j = 0; j < path.size(); j++) {

HashMap<String, String> point = path.get(j);

double lat = Double.parseDouble(point.get("lat"));

double lng = Double.parseDouble(point.get("lng"));

LatLng position = new LatLng(lat, lng);

points.add(position);

}

lineOptions.addAll(points);

lineOptions.width(10);

lineOptions.color(Color.BLUE);

if (isSecond) {

lastPolyline.remove();

lastPolyline = mMap.addPolyline(lineOptions);

} else {

lastPolyline = mMap.addPolyline(lineOptions);

isSecond = true;

}

}

}

}

@Override

public boolean onMarkerClick(Marker marker) {

LatLng latLng = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());

distance_task.getDirectionsUrl(latLng, marker.getPosition());

distance_task.setLoadListener(new CalculateDistanceTime.taskCompleteListener() {

@Override

public void taskCompleted(String[] time_distance) {

distance_text.setText(time_distance[0]); //Distance

time_text.setText(time_distance[1]); //Time

}

});

String url = getDirectionsUrl(latLng, marker.getPosition());

DownloadTask downloadTask = new DownloadTask();

downloadTask.execute(url);

return false;

}

谢谢你们!

回答:

将数据与标记关联的最简单方法是使用marker.setTag(mData)。您可以检索稍后与marker.getTag()并将它传递给你的警告对话框:

marker.setTag("Example data string"); 

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

builder.setMessage(marker.getTag())

.create()

.show();

回答:

您可以将所有标志和特定信息的一个HashMap中,并通过调用markerList.get(marker)得到的任何标记方法的信息的字符串。

private HashMap<Marker, String> markerList = new HashMap<>(); 

private GoogleMap mMap; //also instantiate your map

private void addMarker(String information, LatLng pos){

MarkerOptions options = new MarkerOptions();

options.position(pos);

options.title("title");

Marker mapMarker = mMap.addMarker(options);

markerList.put(mapMarker, information);

}

以上是 检查已经点击了哪个标记 - 显示对话框信息 的全部内容, 来源链接: utcz.com/qa/258354.html

回到顶部