Search code examples
androidandroid-maps-v2android-mapspolyline

Android- onPolylineClick don't work?


I am adding polyline on map and I enable setClickable(true) but when I use from Clickable don't work ?

private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String,String>>>> {

    @Override
    protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {

        JSONObject jObject;
        List<List<HashMap<String, String>>> routes = null;

        try{
            jObject = new JSONObject(jsonData[0]);
            parser = new DirectionsJSONParser();

            // Starts parsing data
            routes = parser.parse(jObject);
        }catch(Exception e){
            e.printStackTrace();
        }
        return routes;
    }

    @Override
    protected void onPostExecute(List<List<HashMap<String, String>>> result) {
        ArrayList<LatLng> points = null;
        PolylineOptions lineOptions = null;
        MarkerOptions markerOptions = new MarkerOptions();

        // Traversing through all the routes
        for(int i=0;i<result.size();i++){
            points = new ArrayList<LatLng>();
            lineOptions = new PolylineOptions();
            String color = colors[i % colors.length];
            // Fetching i-th route
            List<HashMap<String, String>> path = result.get(i);

            // Fetching all the points in i-th route
            for(int j=0;j<path.size();j++){
                HashMap<String,String> point = path.get(j);

                double lat = Double.parseDouble(point.get("lat"));
                double lng = Double.parseDouble(point.get("lng"));
                LatLng position = new LatLng(lat, lng);

                points.add(position);
            }

            // Adding all the points in the route to LineOptions
            lineOptions.addAll(points);
            lineOptions.width(15);
            lineOptions.clickable(true);
            lineOptions.color(Color.parseColor(color));
            // Drawing polyline in the Google Map for the i-th route
            Polyline polyline = mMap.addPolyline(lineOptions);
            polyline.setClickable(true);

        }
    }
}

then I implements GoogleMap.OnPolylineClickListener :

@Override
public void onPolylineClick(Polyline polyline) {
    Log.i("LOG","OK");
}

I can't see any log .


Solution

  • I see this sample and resolve my problem :

    public class PolylineDemoActivity extends AppCompatActivity
            implements OnSeekBarChangeListener, OnMapReadyCallback {
    
        private static final LatLng MELBOURNE = new LatLng(-37.81319, 144.96298);
    
        private static final LatLng SYDNEY = new LatLng(-33.87365, 151.20689);
    
        private static final LatLng ADELAIDE = new LatLng(-34.92873, 138.59995);
    
        private static final LatLng PERTH = new LatLng(-31.95285, 115.85734);
    
        private static final LatLng LHR = new LatLng(51.471547, -0.460052);
    
        private static final LatLng LAX = new LatLng(33.936524, -118.377686);
    
        private static final LatLng JFK = new LatLng(40.641051, -73.777485);
    
        private static final LatLng AKL = new LatLng(-37.006254, 174.783018);
    
        private static final int WIDTH_MAX = 50;
    
        private static final int HUE_MAX = 360;
    
        private static final int ALPHA_MAX = 255;
    
        private Polyline mMutablePolyline;
    
        private Polyline mClickablePolyline;
    
        private SeekBar mColorBar;
    
        private SeekBar mAlphaBar;
    
        private SeekBar mWidthBar;
    
        private CheckBox mClickabilityCheckbox;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.polyline_demo);
    
            mColorBar = (SeekBar) findViewById(R.id.hueSeekBar);
            mColorBar.setMax(HUE_MAX);
            mColorBar.setProgress(0);
    
            mAlphaBar = (SeekBar) findViewById(R.id.alphaSeekBar);
            mAlphaBar.setMax(ALPHA_MAX);
            mAlphaBar.setProgress(255);
    
            mWidthBar = (SeekBar) findViewById(R.id.widthSeekBar);
            mWidthBar.setMax(WIDTH_MAX);
            mWidthBar.setProgress(10);
    
            mClickabilityCheckbox = (CheckBox) findViewById(R.id.toggleClickability);
    
            SupportMapFragment mapFragment =
                    (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
            mapFragment.getMapAsync(this);
        }
    
        @Override
        public void onMapReady(GoogleMap map) {
            // Override the default content description on the view, for accessibility mode.
            // Ideally this string would be localised.
            map.setContentDescription("Google Map with polylines.");
    
            // A simple polyline with the default options from Melbourne-Adelaide-Perth.
            map.addPolyline((new PolylineOptions())
                    .add(MELBOURNE, ADELAIDE, PERTH));
    
            // A geodesic polyline that goes around the world.
            mClickablePolyline = map.addPolyline((new PolylineOptions())
                    .add(LHR, AKL, LAX, JFK, LHR)
                    .width(5)
                    .color(Color.BLUE)
                    .geodesic(true)
                    .clickable(mClickabilityCheckbox.isChecked()));
    
            // Rectangle centered at Sydney.  This polyline will be mutable.
            int radius = 5;
            PolylineOptions options = new PolylineOptions()
                    .add(new LatLng(SYDNEY.latitude + radius, SYDNEY.longitude + radius))
                    .add(new LatLng(SYDNEY.latitude + radius, SYDNEY.longitude - radius))
                    .add(new LatLng(SYDNEY.latitude - radius, SYDNEY.longitude - radius))
                    .add(new LatLng(SYDNEY.latitude - radius, SYDNEY.longitude + radius))
                    .add(new LatLng(SYDNEY.latitude + radius, SYDNEY.longitude + radius));
            int color = Color.HSVToColor(
                    mAlphaBar.getProgress(), new float[]{mColorBar.getProgress(), 1, 1});
            mMutablePolyline = map.addPolyline(options
                    .color(color)
                    .width(mWidthBar.getProgress())
                    .clickable(mClickabilityCheckbox.isChecked()));
    
            mColorBar.setOnSeekBarChangeListener(this);
            mAlphaBar.setOnSeekBarChangeListener(this);
            mWidthBar.setOnSeekBarChangeListener(this);
    
            // Move the map so that it is centered on the mutable polyline.
            map.moveCamera(CameraUpdateFactory.newLatLng(SYDNEY));
    
            // Add a listener for polyline clicks that changes the clicked polyline's color.
            map.setOnPolylineClickListener(new GoogleMap.OnPolylineClickListener() {
                @Override
                public void onPolylineClick(Polyline polyline) {
                    // Flip the values of the r, g and b components of the polyline's color.
                    int strokeColor = polyline.getColor() ^ 0x00ffffff;
                    polyline.setColor(strokeColor);
                }
            });
        }
    
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // Don't do anything here.
        }
    
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // Don't do anything here.
        }
    
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            if (mMutablePolyline == null) {
                return;
            }
    
            if (seekBar == mColorBar) {
                mMutablePolyline.setColor(Color.HSVToColor(
                        Color.alpha(mMutablePolyline.getColor()), new float[]{progress, 1, 1}));
            } else if (seekBar == mAlphaBar) {
                float[] prevHSV = new float[3];
                Color.colorToHSV(mMutablePolyline.getColor(), prevHSV);
                mMutablePolyline.setColor(Color.HSVToColor(progress, prevHSV));
            } else if (seekBar == mWidthBar) {
                mMutablePolyline.setWidth(progress);
            }
        }
    
        /**
         * Toggles the clickability of two polylines based on the state of the View that triggered this
         * call.
         * This callback is defined on the CheckBox in the layout for this Activity.
         */
        public void toggleClickability(View view) {
            if (mClickablePolyline != null) {
                mClickablePolyline.setClickable(((CheckBox) view).isChecked());
            }
            if (mMutablePolyline != null) {
                mMutablePolyline.setClickable(((CheckBox) view).isChecked());
            }
        }
    }