Banana
Banana

Reputation: 2443

Reenabling a Long Click on Map

I have a map, where the user has the option to long click and add a marker (it opens the new activity with intent, so he can add info about the marker). I had a problem with multiple long clicks, opening multiple new activities. I found this solution, and was able to block multiple long clicks, but the resetting long clicks after the user has opened new activity did not work for me.

My maps fragment:

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

    }
});

Upvotes: 0

Views: 349

Answers (2)

Banana
Banana

Reputation: 2443

Found a workaround - I used ProgressDialog to disable user to longclick twice:

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

Upvotes: 0

Sachin Varma
Sachin Varma

Reputation: 2235

Create a listener for the long click, eg:

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

and at your onMapReady, setListener for onMapLongClickListener:

 mMap.setOnMapLongClickListener(onMapLongClickListener);

You can disable LongClicklistener as per the previous code you are using and add the listener when you got response, Code are included in my onMapLongClick(), you just have to copy the code and add listener on onMapReady() as i mentioned above.

Let me know whether it solves your problem or not.

Upvotes: 2

Related Questions