android - 如何在 setOnInfoWindowClickListener 中获取在 Google Map 中单击的标记的 ID

标签 android google-maps google-maps-api-3

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

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;
    }
}

}

最佳答案

添加 product.id作为tag为你的 Marker :

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);
    }
}

关于android - 如何在 setOnInfoWindowClickListener 中获取在 Google Map 中单击的标记的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43254665/

相关文章:

android - 太多(可能超过 10,000 个)绘制的多边形落后于谷歌地图

css - wordpress 页面中的 Google map 样式问题

javascript - 作为矢量 map 的谷歌地图

android - Android 上的 GStreamer

android - 文本与另一个文本的右下对齐

java - 如何使用套接字编程在两个 android 手机之间创建实时音频流..?

javascript - 用于 IE7/8 的 jQuery UI 对话框中的 Google Maps V3

java - 不确定如何使用 Android 在新 Activity 中显示结果

google-maps - 连接超时 - 获取请求

javascript - 在 Google Maps V3 中获取 GeoJSON 数据层的属性