【问题标题】:How to get id of Marker clicked in Google Map inside setOnInfoWindowClickListener如何获取在 setOnInfoWindowClickListener 内的 Google 地图中单击的标记的 ID
【发布时间】:2017-04-06 12:01:58
【问题描述】:

这里我要做的是在 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;
    }
}

}

【问题讨论】:

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


    【解决方案1】:

    为您的Marker 添加product.id 作为tag

    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&lt;Marker, String&gt; 来存储与每个Marker 关联的id

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

    【讨论】:

    • marker.setTag(product.id) 错误消息变量标记可能未初始化。
    • 我正在使用不支持.setTag 的旧谷歌地图服务。我可以在其中使用什么?
    • 我该怎么做才能使用同样的东西。
    • 如果不更新play-services-maps 版本,您将无法使用setTag。看看我在回答中提出的替代方案
    • 现在非常感谢,一个问题解决了。你能解决我的其他问题吗?这对我来说很好吗?link
    猜你喜欢
    • 2017-03-21
    • 2017-08-10
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    相关资源
    最近更新 更多