如何在setOnInfoWindowClickListener中的Google Map中点击Marker的id [英] How to get id of Marker clicked in Google Map inside setOnInfoWindowClickListener

查看:194
本文介绍了如何在setOnInfoWindowClickListener中的Google Map中点击Marker的id的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这里我要做的是在doInBackground中设置Id,并在 setOnInfoWindowClickListener 中调用它。但问题是它获得了第一个元素的Id名单。我想要的是获得被点击的标记的Id。
我使用一个变量 private static String id; 存储id product.id = productJSON.getString(ID); / code>像这样 id = product.id; 然后分配它。

  googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener(){

@Override
public void onInfoWindowClick(Marker arg0){

intent.putExtra(PRODUCT_ID (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静态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坐标=新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>> {

私人String serverUrl;

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

@覆盖
保护列表< 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());

//设置验证者
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);


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

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

StringBuffer stringBuffer = new StringBuffer();
字符串行; ((line = bufferedReader.readLine())!= null){
stringBuffer.append(line);
while(
}

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

列表<产品> products = new ArrayList<>();
HashMap< String,Bitmap> iconsMap = new HashMap<>();
尝试{
JSONArray productsJSON = response.getJSONArray(all_products);
for(int ixProduct = 0; ixProduct< productsJSON.length(); ixProduct ++){
JSONObject productJSON = productsJSON.getJSONObject(ixProduct);
字符串mapIconStr = productJSON.getString(map_icon);
URI uri =新URI(mapIconStr);
String [] segments = uri.getPath()。split(/);
String iconName = segments [segments.length-1];

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

//将http:替换为https:
iconUrlString = iconUrlString.replace(http:,https:);

位图bmp;
if(!iconsMap.containsKey(iconUrlString)){
bmp = getBitmapFromURL(iconUrlString);
//用独特的图标填充地图
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);
$ b $ catch(Exception ignore){
}
}

}

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

退货产品;

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




@Override
protected void onPostExecute(List< Product>产品)
{
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))
);




$ b public static Bitmap getBitmapFromURL(String src){
try {
URL url =新网址(src);
HttpURLConnection连接=(HttpURLConnection)url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inSampleSize = 1;
bmOptions.inJustDecodeBounds = false;
位图myBitmap = BitmapFactory.decodeStream(input,null,bmOptions);
返回myBitmap;
} catch(IOException e){
return null;



$ b


解决方案

为您的添加 product.id 作为标记标记

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

然后在 OnInfoWindowClickListener code> tag :

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






另一个选项可能是保存 Map< Marker,String> 来存储与每个标记相关联的 id / code>:

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

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

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



<然后在你的 OnInfoWindowClickListener 上获取标记

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


Here what I am trying to do is set Id inside doInBackground and call it in setOnInfoWindowClickListener.But the problem is that it is getting the Id of the first element in the list. What I want is to get Id of Marker which is clicked. I am using a variable private static String id; To store id product.id=productJSON.getString("ID"); like this id=product.id; then assign it.

googlemap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {

        @Override
        public void onInfoWindowClick(Marker arg0) {

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

How can I get id from ondoInBackground and use in 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;
    }
}

}

解决方案

Add the product.id as a tag for your 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);

And then on your OnInfoWindowClickListener get the tag:

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


Another option could be to keep a Map<Marker, String> to store the id associated to each Marker:

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

You will need to create your markers and store them like this:

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

And then on your OnInfoWindowClickListener get the tag:

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

这篇关于如何在setOnInfoWindowClickListener中的Google Map中点击Marker的id的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆