用户在地图上的针点位置,并将位置的地址提取回文本框

时间:2011-11-22 14:36:11

标签: android

我在其他活动中有这个文本框,还有一个导致此地图的按钮。我想要做的是它允许用户点击地图并指出他们想要的位置,他们也可以在不输入的情况下将该位置的地址提取回文本框。可以这样做吗?从现在起,这个警告对话框会在用户使用2个按钮指向它后弹出(是和否)所以如果是,则将该位置地址提取回文本框。有什么想法吗?

    static EditText txtLocation;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mapview);

        mapView = (MapView) findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true);
        mc = mapView.getController();

        List<Overlay> mapOverlays = mapView.getOverlays();
        MapOverlay mapOverlay = new MapOverlay();

        mapOverlays.add(mapOverlay);

        // obtain gps location
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        locationListener = new MyLocationListener();

        lm.requestLocationUpdates(
        // LocationManager.GPS_PROVIDER,
                LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
    }

    private class MyLocationListener implements LocationListener {

        public void onLocationChanged(Location loc) {
            if (loc != null) {
                Toast.makeText(
                        getBaseContext(),
                        "Location changed: Lat: " + loc.getLatitude()
                                + " Lng: " + loc.getLongitude(),
                        Toast.LENGTH_SHORT).show();
            }
            p = new GeoPoint((int) (loc.getLatitude() * 1E6),
                    (int) (loc.getLongitude() * 1E6));
            mc.animateTo(p);
            mc.setZoom(18);

            // Add a location marker
            MapOverlay mapOverlay = new MapOverlay();
            List<Overlay> listofOverlays = mapView.getOverlays();
            listofOverlays.clear();
            listofOverlays.add(mapOverlay);

            // invalidate() method forces the MapView to be redrawn
            mapView.invalidate();
        }

        public void onProviderDisabled(String provider) {
        }

        public void onProviderEnabled(String provider) {
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

    class MapOverlay extends com.google.android.maps.Overlay {

        @Override
        public boolean onTap(final GeoPoint p, MapView mapView) {
            // TODO Auto-generated method stub

            k = p;
            mc = mapView.getController();
            mc.animateTo(p);

            mapView.invalidate();

            Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());
            try{
            List<Address> addresses = geoCoder.getFromLocation(
            p.getLatitudeE6() /1E6,
            p.getLongitudeE6() / 1E6, 1
            );
            String add = "";
            if (addresses.size()>0)
            {
                for (int i=0; i<addresses.get(0).getMaxAddressLineIndex(); i++)
                    add += addresses.get(0).getAddressLine(i) + "\n";
            }

//          txtLocation.setText(add);   
            Toast.makeText(getBaseContext(), add, Toast.LENGTH_SHORT).show();
            }
            catch (IOException e){
                e.printStackTrace();
            }

            new AlertDialog.Builder(MapsActivity.this)
                    .setTitle("Change location..")
                    .setMessage("go to the new location?")
                    .setNegativeButton("NO",
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog,
                                        int which) {
                                    // TODO Auto-generated method stub
                                    dialog.dismiss();
                                }
                            })
                    .setPositiveButton("YES",
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog,
                                        int which) {
                                    // TODO Auto-generated method stub
                                    Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());
                                    try{
                                    List<Address> addresses = geoCoder.getFromLocation(
                                    p.getLatitudeE6() /1E6,
                                    p.getLongitudeE6() / 1E6, 1
                                    );
                                    String add = "";
                                    if (addresses.size()>0)
                                    {
                                        for (int i=0; i<addresses.get(0).getMaxAddressLineIndex(); i++)
                                            add += addresses.get(0).getAddressLine(i) + "\n";
                                    }

                                    txtLocation.setText(add);   
//                                  Toast.makeText(getBaseContext(), add, Toast.LENGTH_SHORT).show();
                                    }
                                    catch (IOException e){
                                        e.printStackTrace();
                                    }
                                }
                            }).show();
            return true;
        }

        @Override
        public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
                long when) {
            super.draw(canvas, mapView, shadow);
            if (k != null) {
                // ---translate the GeoPoint to screen pixels---
                Point screenPts = new Point();
                mapView.getProjection().toPixels(k, screenPts);

                // ---add the marker---
                Bitmap bmp = BitmapFactory.decodeResource(getResources(),
                        R.drawable.marker);
                canvas.drawBitmap(bmp, screenPts.x - 10, screenPts.y - 34, null);
            }
            return true;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您可以尝试反向地理编码。你需要的是提供用户点击的长点,这很容易 检查this类似的问题。可能有所帮助。