2017-04-06 148 views
2

这里我想要做的是在doInBackground中设置Id并在setOnInfoWindowClickListener中调用它。但问题是它获取列表中的第一个元素的Id 。我想要的是获得被点击的标记的Id。 我正在使用变量private static String id;要存储编号product.id=productJSON.getString("ID");这样的id=product.id;然后分配它。如何获得标记点击Google地图内的标记setOnInfoWindowClickListener

googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { 

     @Override 
     public void onInfoWindowClick(Marker arg0) { 

      intent.putExtra("PRODUCT_ID",id); 
      System.out.println(id); 
      startActivity(intent); 
     } 

如何从ondoInBackground获得ID和intent.putExtra()使用。

public class Frnt_mapActivity extends Activity { 


JSONArray jsonarray3; 
// Google Map 
private static GoogleMap googlemap; 
private static String id; 

private Intent intent; 
HashMap<Marker, Integer> hashMap=new HashMap<Marker, Integer>(); 
public static LatLng latlong ; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.frnt_map_activity); 


    googlemap=((MapFragment)getFragmentManager().findFragmentById(R.id.places_map)).getMap(); 
    googlemap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
    googlemap.setMyLocationEnabled(true); 
    googlemap.getUiSettings().setZoomControlsEnabled(true); 
    googlemap.getUiSettings().setMyLocationButtonEnabled(true); 
    googlemap.getUiSettings().setCompassEnabled(true); 
    googlemap.getUiSettings().setRotateGesturesEnabled(true); 
    googlemap.getUiSettings().setZoomGesturesEnabled(true); 
    googlemap.setMyLocationEnabled(true); 
    LatLng coordinate = new LatLng(50.85514, 0.58382); 
    CameraUpdate yourLocation = CameraUpdateFactory.newLatLngZoom(coordinate, 18); 
    googlemap.animateCamera(yourLocation); 

    new Frnt_mIcons_Activity().execute(); 
    new LocationList().execute(); 
    new LookingForList().execute(); 
    CreateProductListTask responseDownloadTask = new CreateProductListTask("https://www.towncitycards.com/webservice_action.php?action=all_products"); 
    responseDownloadTask.execute(); 
    intent=new Intent(Frnt_mapActivity.this,MainActivity.class); 
    googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { 

     @Override 
     public void onInfoWindowClick(Marker arg0) { 

      intent.putExtra("PRODUCT_ID",id); 
      System.out.println(id); 
      startActivity(intent); 
     } 
    }); 


protected class CreateProductListTask extends AsyncTask<Void, Void, List<Product>> { 

    private String serverUrl; 

    public CreateProductListTask(String url) { 
     super(); 
     this.serverUrl = url; 
    } 

     @Override 
    protected List<Product> doInBackground(Void... params) 
    { 

     HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; 

     DefaultHttpClient client = new DefaultHttpClient(); 

     SchemeRegistry registry = new SchemeRegistry(); 
     SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory(); 
     socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); 
     registry.register(new Scheme("http", socketFactory, 443)); 
     SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry); 
     DefaultHttpClient httpClient = new DefaultHttpClient(mgr, client.getParams()); 

// Set verifier 
      HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); 


     HttpPost httpPost = new HttpPost("http://towncitycards.com/webservice_action.php?action=all_products"); 

     URLConnection urlConn = null; 
     BufferedReader bufferedReader = null; 
     try 
     { 
      URL url = new URL(this.serverUrl); 
      urlConn = url.openConnection(); 
      bufferedReader = new BufferedReader(new InputStreamReader(urlConn.getInputStream())); 

      StringBuffer stringBuffer = new StringBuffer(); 
      String line; 
      while ((line = bufferedReader.readLine()) != null) { 
       stringBuffer.append(line); 
      } 

      JSONObject response = new JSONObject(stringBuffer.toString()); 

      List<Product> products = new ArrayList<>(); 
      HashMap<String, Bitmap> iconsMap = new HashMap<>(); 
      try { 
       JSONArray productsJSON = response.getJSONArray("all_products"); 
       for (int ixProduct=0; ixProduct<productsJSON.length(); ixProduct++) { 
        JSONObject productJSON = productsJSON.getJSONObject(ixProduct); 
        String mapIconStr = productJSON.getString("map_icon"); 
        URI uri = new URI(mapIconStr); 
        String[] segments = uri.getPath().split("/"); 
        String iconName = segments[segments.length-1]; 

        // percetn-encode URL 
        String mapIconPath = mapIconStr.substring(0, mapIconStr.indexOf(iconName)); 
        String iconUrlString = mapIconPath + URLEncoder.encode(iconName, "UTF-8"); 

        // replace "http:" with "https:" 
        iconUrlString = iconUrlString.replace("http:", "https:"); 

        Bitmap bmp; 
        if (!iconsMap.containsKey(iconUrlString)) { 
         bmp = getBitmapFromURL(iconUrlString); 
         // populate map with unique icons 
         iconsMap.put(iconUrlString, bmp); 
        } else { 
         bmp = iconsMap.get(iconUrlString); 
        } 

        if (bmp != null) { 
         try { 
          Product product = new Product(); 
          product.id=productJSON.getString("ID"); 
          product.name = productJSON.getString("post_title"); 
          product.lat = productJSON.getDouble("latitude"); 
          product.lon = productJSON.getDouble("longitude"); 
          id=product.id; 
          bmp = Bitmap.createScaledBitmap(bmp,(int)(bmp.getWidth()*3), (int)(bmp.getHeight()*3), true); 
          product.icon = bmp; 
          products.add(product); 

         } catch (Exception ignore) { 
         } 
        } 

       } 

      } catch (JSONException ex) { 
       Log.e("App", "Failure", ex); 
      } 

      return products; 
     } 
     catch(Exception ex) 
     { 
      Log.e("App", "yourDataTask", ex); 
      return null; 
     } 
     finally 
     { 
      if(bufferedReader != null) 
      { 
       try { 
        bufferedReader.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

    @Override 
    protected void onPostExecute(List<Product> products) 
    { 
     if(products != null) { 
      for (final Product product : products) { 

       googlemap.addMarker(new MarkerOptions() 
         .position(new LatLng(product.lat, product.lon)) 
         .title(product.name) 
         .icon(BitmapDescriptorFactory.fromBitmap(product.icon)) 
       ); 
      } 
     } 
    } 
} 

public static Bitmap getBitmapFromURL(String src) { 
    try { 
     URL url = new URL(src); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoInput(true); 
     connection.connect(); 
     InputStream input = connection.getInputStream(); 
     BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
     bmOptions.inSampleSize = 1; 
     bmOptions.inJustDecodeBounds = false; 
     Bitmap myBitmap = BitmapFactory.decodeStream(input, null, bmOptions); 
     return myBitmap; 
    } catch (IOException e) { 
     return null; 
    } 
} 

} 

回答

3

添加product.id作为tagMarker

Marker marker = googleMap.addMarker(new MarkerOptions() 
     .position(new LatLng(product.lat, product.lon)) 
     .title(product.name) 
     .icon(BitmapDescriptorFactory.fromBitmap(product.icon))); 
marker.setTag(product.id); 

,然后在你的OnInfoWindowClickListener得到tag

googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { 
    @Override 
    public void onInfoWindowClick(Marker marker) { 
     intent.putExtra("PRODUCT_ID",(String) marker.getTag()); 
     startActivity(intent); 
    } 
} 

另一种选择可能是保持Map<Marker, String>来存储id关联到每个Marker

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

您将需要创建您的标记,并将它们存储这样的:在

Marker marker = googleMap.addMarker(new MarkerOptions().position(markerPosition).title("my marker")); 
markerIds.put(marker, product.id); 

然后你OnInfoWindowClickListener得到tag

googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { 
    @Override 
    public void onInfoWindowClick(Marker marker) { 
     intent.putExtra("PRODUCT_ID",markerIds.get(marker)); 
     startActivity(intent); 
    } 
} 
+0

'标记.setTag(product.id)'错误消息变量标记可能未被初始化。 – priya

+0

我使用的是旧的谷歌地图服务,其中'.setTag'不支持。我可以在里面使用它吗? – priya

+0

我能做些什么来使用相同的东西。 – priya