【问题标题】:OnMarkerClick within a loop循环内的 OnMarkerClick
【发布时间】:2017-03-31 22:16:26
【问题描述】:

在尝试开发具有多个标记的地图应用程序时,允许在单击标记时显示带有信息的弹出窗口,但在显示信息时我遇到了这个问题(根据循环,它必须是不同的信息订单,但它一直要求变量必须是最终的),但即使我将变量设为全局变量,我对所有弹出窗口(最后一条记录的值)的结果都相同,对不起我的英语,请帮助。

@Override
protected void onResume() {
super.onResume();
if(broadcastReceiver == null){
    broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

Response.Listener<String> responseListener =new Response.Listener<String>() {

                @Override
                public void onResponse(String response) {
                    if(response== null){

                        Toast.makeText(getApplicationContext(),response,Toast.LENGTH_LONG);

                    }
                    else {
                        try {
                             jsonObject = new JSONObject(response);
                              jsonArray = jsonObject.getJSONArray("response");
                            int i=0 ;
                            int id,e;
                            Double lt,lg;
                            while (i<jsonArray.length()) {
                                 jo = jsonArray.getJSONObject(i);
                                e=  jo.getInt("etat");

                                id= jo.getInt("driver_id");

                                lt=jo.getDouble("latitude");

                                lg= jo.getDouble("longitude");


                                map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                                    @Override
                                    public boolean onMarkerClick( Marker marker) {
                                        if(marker.getTitle() != null){
                                            return true;
                                        }else{

                                            layoutInflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE);
                                            ViewGroup container = (ViewGroup) layoutInflater.inflate(R.layout.popup,null);

                                            popupWindow = new PopupWindow(container, 500,500,true);
                                            popupWindow.showAtLocation(relativeLayout, Gravity.NO_GRAVITY, 100,100);
                                            TextView tvNom= (TextView) container.findViewById(R.id.tvNom);

                                            tvNom.setText(id +"");

                                            container.setOnTouchListener(new View.OnTouchListener() {
                                                @Override
                                                public boolean onTouch(View view, MotionEvent motionEvent) {
                                                    popupWindow.dismiss();
                                                    return true;
                                                }
                                            });


                                            return false;}
                                    }
                                });
                                if(e==0) {
                                    marker = markerMap.get(d);
                                    if (marker != null) {
                                        marker.remove();
                                        markerMap.remove(d);
                                    } else {
                                        markerMap.remove(d);
                                    }

                                }
                                else{


                                    if (markerMap.containsKey(id)) {
                                        Intent intent= new Intent(MapActivity.this,InfoWindow.class);
                                        intent.putExtra("id",id+"");

                                        // Update the location.
                                        marker = markerMap.get(id);
                                        marker.remove();
                                        markerMap.remove(id); //added
                                        MarkerOptions markerOpt = new MarkerOptions()
                                                .position(new LatLng(lt,lg)).visible(true);
                                        marker = map.addMarker(markerOpt);
                                        markerMap.put(id, marker);


                                    } else {

                                        MarkerOptions markerOpt = new MarkerOptions()
                                                .position(new LatLng(lt, lg)).visible(true);

                                        marker = map.addMarker(markerOpt);
                                        markerMap.put(id, marker);



                                    }   }



                              i++;}


                        }catch (JSONException e) {
                            e.printStackTrace();
                            AlertDialog.Builder nbuilder = new AlertDialog.Builder(MapActivity.this);
                            nbuilder.setMessage("Error")
                                    .setNegativeButton("Retry", null)
                                    .create()
                                    .show();
                        }

                    }

                }
            };
            RetrieveCoordinates retrieve = new RetrieveCoordinates ( responseListener );
            RequestQueue queue = Volley.newRequestQueue(MapActivity.this);
            queue.add( retrieve);

        }
    };
}
registerReceiver(broadcastReceiver, new IntentFilter("location_update"));

}

【问题讨论】:

  • 你不应该在循环中调用map.setOnMarkerClickListener()。您只需要一个侦听器,它会被点击地图上的任何标记调用。在这里查看一个简单的例子:stackoverflow.com/questions/29740839/…
  • 谢谢,我试试看告诉你。
  • 先生,对不起,我没听懂,您告诉我不要使用 map.setOnMarkerClickListener() 但在您给出的示例中他们正在使用它!
  • 你仍然需要使用它,但不应该在循环中调用它。
  • 您能解释一下吗

标签: android json google-maps


【解决方案1】:

正如您所指出的,您的所有侦听器都仅添加到地图对象中。 API 提供的用于在每个标记对象上附加不同信息的是一个名为 tag 的属性。

在标记对象上使用 setTag(Object)。

无论你在哪里声明了你的标记,循环遍历它们并附加你想要的标签:

for(int i=0; i < allMarkers.length; i++)
    marker.setTag();

然后像这样分配监听器:

map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                                @Override
                                public boolean onMarkerClick( Marker marker) {
                                    if(marker.getTitle() != null){
                                        return true;
                                    }else{

                                        layoutInflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE);
                                        ViewGroup container = (ViewGroup) layoutInflater.inflate(R.layout.popup,null);

                                        popupWindow = new PopupWindow(container, 500,500,true);
                                        popupWindow.showAtLocation(relativeLayout, Gravity.NO_GRAVITY, 100,100);
                                        TextView tvNom= (TextView) container.findViewById(R.id.tvNom);
                                        //---------retrieve this marker's tag - could be Integer or any other Object.
                                        int id = (Integer)marker.getTag();

                                        tvNom.setText(id +"");

                                        container.setOnTouchListener(new View.OnTouchListener() {
                                            @Override
                                            public boolean onTouch(View view, MotionEvent motionEvent) {
                                                popupWindow.dismiss();
                                                return true;
                                            }
                                        });


                                        return false;}
                                }
                            });

【讨论】:

  • dev8080,我试了你说的,还是一样的值
  • 查看我的编辑。我假设你只想要内部类中的 id 。
  • 好的,我会告诉你我得到了什么
  • 嗯,这就是答案......从来没有看过那个,因为我认为这是循环变量不能在内部类中持续存在的问题。但那你为什么一开始就使用循环呢?
  • 查看编辑。我不知道标记和 ID 在您的情况下是如何相互关联的,所以只是给了您一个大纲并在您的听众中更改了一行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 2014-06-18
相关资源
最近更新 更多