2017-04-12 2 views
-1

Ceci est ma première fois de travail avec Google Maps donc désolé si c'est un problème de débutant. Je travaille sur une application qui se connecte à un capteur portable. Le capteur envoie des données de pollution toutes les 2 minutes. Chaque fois que je reçois de nouvelles données, un marqueur est placé sur Google Maps et je veux montrer les données dans la fenêtre d'information des marqueurs afin que vous puissiez voir comment la pollution diffère selon l'endroit où vous êtes.Android/Google Maps: Comment obtenir différentes fenêtres d'informations pour différents marqueurs?

Mon problème est que dès maintenant, toutes les fenêtres d'information de mes marqueurs sont mises à jour avec les données les plus récentes. Je dois faire en sorte que chaque marqueur possède sa propre fenêtre d'information séparée avec des données uniques.

Je pense que j'ai besoin de mettre en œuvre OnInfoWindowClickListener en quelque sorte et aussi que j'ai besoin de l'ID de chaque marqueur. J'ai essayé d'examiner les réponses dans d'autres discussions et jusqu'à présent je n'ai pas compris comment je devrais résoudre ce problème.

apprécierais toute aide possible

Ceci est mon code en ce moment.

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

    .... 


/* Here we create the infoWindow **/ 
protected synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
    mGoogleApiClient.connect(); 

    mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { 

     public View getInfoWindow(Marker arg0) { 
      View v = getLayoutInflater().inflate(R.layout.custom_infowindow, null); 
      TextView tv = (TextView) v.findViewById(R.id.infoText); 
      tv.setText("CO2 data: "+String.valueOf(co_mV) + "mV" +"\n" + "N2 data: "+String.valueOf(no2_mV) +" mV"); 

      return v; 
     } 

     public View getInfoContents(Marker arg0) { 


      return null; 

     } 
    }); 

} 

.... 

@Override 
public void onLocationChanged(Location location) { 

    if (!initiateApp) { 
     if(location.distanceTo(mLastLocation) < 20) { 
      markerArrayList.get(markerArrayList.size()-1).remove(); 
      markerArrayList.remove(markerArrayList.size()-1); 
      Toast.makeText(
        getApplicationContext(), 
        "Reading to close to last reading, replace last reading", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    if (markerArrayList.size() == 3) { 
     markerArrayList.get(0).remove(); 
     markerArrayList.remove(0); 
    } 

    //Place current location marker 
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
    MarkerOptions markerOptions = new MarkerOptions(); 
    markerOptions.position(latLng); 
    markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); 
    mCurrLocationMarker = mMap.addMarker(markerOptions); 
    markerArrayList.add(mCurrLocationMarker); 

    mLastLocation = location; 



    Log.d("ADebugTag", "Value: " + Double.toString(location.getLatitude())); 
    Log.d("ADebugTag", "Value: " + Double.toString(location.getLongitude())); 


    //move map camera 

    if(initiateApp){ 
     mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15)); 
    } 
    initiateApp = false; 

    boolean contains = mMap.getProjection() 
      .getVisibleRegion() 
      .latLngBounds 
      .contains(latLng); 

    if(!contains){ 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
    } 
} 

EDIT Les données que je veux montrer est "co_mV" et "no2_mV".

 @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 


     try { 
      JSONObject parser = new JSONObject(values[0]); 
      JSONObject d = parser.getJSONObject("d"); 
      co_mV = d.getInt("co_mV"); 
      no2_mV = d.getInt("no2_mV"); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     newData(); 

     //response received from server 
     Log.d("CO2", values[0]); 
     long timeStamp = System.currentTimeMillis()/1000L; 
     time=new java.util.Date((long)timeStamp*1000); 




     //process server response here.... 

    } 

} 

Répondre

0

créer un infowWindowAdapter comme celui-ci

public class YourCustomInfoWindowAdpater implements GoogleMap.InfoWindowAdapter { 
private final View mymarkerview; 
private Context context; 
private List<YourModelClass> nearByModel; 
private Location currentMarker; 

public YourCustomInfoWindowAdpater(Context context) { 
    this.context = context; 
    currentMarker = new Location(); 
    mymarkerview = ((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)) 
      .inflate(R.layout.custominfowindow, null); 
} 

public View getInfoWindow(Marker marker) { 
    render(marker, mymarkerview); 
    return mymarkerview; 
} 

public View getInfoContents(Marker marker) { 
    View v = ((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.custominfowindow, null); 

    // Getting the position from the marker 
    LatLng latLng = marker.getPosition(); 
    // Getting reference to the TextView to set latitude 
    /* TextView tvLat = (TextView) v.findViewById(R.id.tv_lat); 

    // Getting reference to the TextView to set longitude 
    TextView tvLng = (TextView) v.findViewById(R.id.tv_lng); 

    // Setting the latitude 
    tvLat.setText("Latitude:" + latLng.latitude); 

    // Setting the longitude 
    tvLng.setText("Longitude:"+ latLng.longitude);*/ 

    // Returning the view containing InfoWindow contents 
    return v; 
} 

private void render(Marker marker, View view) { 
    TextView place_distance = (TextView) view.findViewById(R.id.place_distance); 

    // Add the code to set the required values 
    // for each element in your custominfowindow layout file 
} 

public void setModels(List<YourModelclass> nearByModel) { 
    this.nearByModel = nearByModel; 
} 
} 

premier appel YourCustomInfoWindowAdpater yourInfo=new YourCustomInfoWindowAdpater(this);

puis définissez googleMap.setInfoWindowAdapter(yourInfo);

et dès que vous obtenez setModels d'appel de données méthode de yourcustominfowindowadpater dans lequel passe votre modèle de données

+0

Merci pour votre réponse. Je ne comprends pas ce que fait SetModels? Est-ce là où je devrais mettre les données co et no2? – Kspr

+0

Aussi qu'est-ce que place_distance? – Kspr

+0

place_distance est une vue de texte dans la fenêtre d'information pour montrer le text.its approprié dans la disposition de la fenêtre d'information. Et les modèles de jeu seront utilisés pour mettre à jour vos données dès que vous avez de nouvelles données, le nombre de données dans ce modèle est égal à non de infowindow avec des données –