2017-12-02 99 views
0

如同标注。我正在寻找一些解决方案。另一方面,我想要实现的是在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; 
} 

谢谢你们!

+0

我不知道你在问什么。 'onMarkerClick'告诉你哪个标记被点击。 – HEATH3N

+0

是的,我知道,但我需要点击检查点击显示有关它的具体信息。如果它会是longclicklistener – deisy

+0

这将是完美的所以你的问题,你不知道如何将数据与每个标记关联? – HEATH3N

回答

0

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

marker.setTag("Example data string"); 

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
builder.setMessage(marker.getTag()) 
     .create() 
     .show(); 
+0

好的,它可以工作,但是我怎样才能在每个标记上显示信息焦点?我的意思是两个不同的弹出应该有两个不同的信息.. – deisy

+0

当你说你想要一个弹出,你指的是一个[对话](https://i.imgur.com/kSq7Jyk.png)或[信息窗口]( https://i.imgur.com/4NKLwym.png)? – HEATH3N

+0

在这一刻我指的是一个对话框,这是错误的方式? – deisy

0

您可以将所有标志和特定信息的一个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); 

    } 
+0

我不知道如何在我的应用中实现这个例子,你可以简化它吗 – deisy

+0

你正在每个'onLocationChanged'上添加一个标记。因此,您可以不添加标记,而是添加标记并将标记与其信息一起存储在hashmap markerList中。并进一步调用'markerList.get(marker)'获取与'onMarkerClick'内的标记相关的信息字符串。 –

+0

您可以向我展示特定示例连接我的代码吗? – deisy

相关问题