2017-03-31 86 views
0

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

@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")); 

} 
+0

你不应该叫'map.setOnMarkerClickListener() '循环内。你只需要一个监听器,并且它会被地图上被点击的任何标记器调用。看到这里的一个简单的例子:http://stackoverflow.com/questions/29740839/how-to-select-and-deselect-a-marker-in-google-maps-in-android –

+0

谢谢,我会尝试它并让你知道。 – Naisy

+0

先生,对不起,我没有得到它,你告诉我不要使用map.setOnMarkerClickListener(),但在你给他们使用它的例子中! – Naisy

回答

1

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

在标记对象上使用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;} 
           } 
          }); 
+0

dev8080,我试过你说的,但是仍然有同样的价值 – Naisy

+1

看我的编辑。我假设你只想在内部类中使用id。 – dev8080

+0

好吧,我会让你知道我得到了什么 – Naisy