重新启用长按地图

Reenabling a Long Click on Map

我有一张地图,用户可以选择长按并添加标记(它会打开新的 activity 并有意添加,因此他可以添加有关标记的信息)。我在多次长按时遇到了问题,打开了多个新活动。我找到了 解决方案,并且能够阻止多次长按,但是在用户打开新 activity 后重置长按对我不起作用。

我的地图片段:

 //Add marker on long click
 mMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {

     @Override
     public void onMapLongClick(final LatLng arg0) {
         // disabling long click
         mMap.setOnMapLongClickListener(null);

         RequestQueue queue = Volley.newRequestQueue(getActivity());
                    String url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=" + String.valueOf(arg0.latitude) + "," + String.valueOf(arg0.longitude) + "&key=myKey";

         // Request a string response from the provided URL.
         StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
             @Override
             public void onResponse(String response) {
                 try {
                     JSONArray jObj = new JSONObject(response).getJSONArray("results").getJSONObject(0).getJSONArray("address_components");

                     Intent intent = new Intent(getActivity(), AddRestaurantActivity.class);

                      for (int i = 0; i < jObj.length(); i++) {
                          String componentName = new JSONObject(jObj.getString(i)).getJSONArray("types").getString(0);
                          if (componentName.equals("postal_code") || componentName.equals("locality") || componentName.equals("street_number") || componentName.equals("route")
                                                    || componentName.equals("neighborhood") || componentName.equals("sublocality") || componentName.equals("administrative_area_level_2")
                                                    || componentName.equals("administrative_area_level_1") || componentName.equals("country")) {
                                                intent.putExtra(componentName, new JSONObject(jObj.getString(i)).getString("short_name"));
                           }
                      }

                       intent.putExtra("latitude", arg0.latitude);
                       intent.putExtra("longitude", arg0.longitude);

                       startActivity(intent);

                   } catch (JSONException e) {
              e.printStackTrace();
              }
          }
    }, new Response.ErrorListener() {

    @Override
    public void onErrorResponse(VolleyError error) {
        int x = 1;
    }
 });
 // Add the request to the RequestQueue.
 queue.add(stringRequest);

    }
});

为长按创建一个监听器,例如:

 GoogleMap.OnMapLongClickListener onMapLongClickListener =new GoogleMap.OnMapLongClickListener() {
        @Override
        public void onMapLongClick(LatLng latLng) {

            mMap.setOnMapLongClickListener(null);

            RequestQueue queue = Volley.newRequestQueue(getActivity());
            String url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=" + String.valueOf(arg0.latitude) + "," + String.valueOf(arg0.longitude) + "&key=myKey";

            // Request a string response from the provided URL.
            StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONArray jObj = new JSONObject(response).getJSONArray("results").getJSONObject(0).getJSONArray("address_components");

                        Intent intent = new Intent(getActivity(), AddRestaurantActivity.class);

                        for (int i = 0; i < jObj.length(); i++) {
                            String componentName = new JSONObject(jObj.getString(i)).getJSONArray("types").getString(0);
                            if (componentName.equals("postal_code") || componentName.equals("locality") || componentName.equals("street_number") || componentName.equals("route")
                              || componentName.equals("neighborhood") || componentName.equals("sublocality") || componentName.equals("administrative_area_level_2")
                              || componentName.equals("administrative_area_level_1") || componentName.equals("country")) {
                                intent.putExtra(componentName, new JSONObject(jObj.getString(i)).getString("short_name"));
                            }
                        }

                        intent.putExtra("latitude", arg0.latitude);
                        intent.putExtra("longitude", arg0.longitude);

                        startActivity(intent);
                        mMap.setOnMapLongClickListener(onMapLongClickListener);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    int x = 1;
                }
            });
            // Add the request to the RequestQueue.
            queue.add(stringRequest);
        }
    };

并在您的 onMapReady 上为 onMapLongClickListener 设置监听器:

 mMap.setOnMapLongClickListener(onMapLongClickListener);

您可以根据您之前使用的代码禁用 LongClicklistener,并在收到响应时添加监听器,代码包含在我的 onMapLongClick() 中,您只需复制如上所述,代码并在 onMapReady() 上添加侦听器。

让我知道它是否解决了您的问题。

找到解决方法 - 我使用 ProgressDialog 禁止用户长按两次:

 GoogleMap.OnMapLongClickListener onMapLongClickListener =new GoogleMap.OnMapLongClickListener() {
        @Override
        public void onMapLongClick(LatLng latLng) {

            ProgressDialog pd = ProgressDialog.show(this,"","Loading. Please wait...",true);

            RequestQueue queue = Volley.newRequestQueue(getActivity());
            String url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=" + String.valueOf(arg0.latitude) + "," + String.valueOf(arg0.longitude) + "&key=myKey";

            // Request a string response from the provided URL.
            StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONArray jObj = new JSONObject(response).getJSONArray("results").getJSONObject(0).getJSONArray("address_components");

                        Intent intent = new Intent(getActivity(), AddRestaurantActivity.class);

                        for (int i = 0; i < jObj.length(); i++) {
                            String componentName = new JSONObject(jObj.getString(i)).getJSONArray("types").getString(0);
                            if (componentName.equals("postal_code") || componentName.equals("locality") || componentName.equals("street_number") || componentName.equals("route")
                              || componentName.equals("neighborhood") || componentName.equals("sublocality") || componentName.equals("administrative_area_level_2")
                              || componentName.equals("administrative_area_level_1") || componentName.equals("country")) {
                                intent.putExtra(componentName, new JSONObject(jObj.getString(i)).getString("short_name"));
                            }
                        }

                        intent.putExtra("latitude", arg0.latitude);
                        intent.putExtra("longitude", arg0.longitude);

                        startActivity(intent);
                        pd.cancel();

                        mMap.setOnMapLongClickListener(onMapLongClickListener);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    pd.cancel();
                }
            });
            // Add the request to the RequestQueue.
            queue.add(stringRequest);
        }
    };