Android: MapView не распознает щелчки - PullRequest
3 голосов
/ 23 декабря 2010

Я просто хочу, чтобы просмотр карты распознал щелчок, чтобы вызвать другое действие.

До сих пор я пробовал обычный «onClick», который всегда работал для меня в обычных представлениях, с последующим переопределением «onTouchEvent» и, наконец, с использованием onClickListener.

Я прошёл все три пути в следующем коде. Любая помощь высоко ценится.

import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;

public class HelloMapView extends MapActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
     final MapView map;
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        map = (MapView) findViewById(R.id.mapview);

        map.setOnClickListener(new MapView.OnClickListener() {
         public void onClick(View v){
          System.out.println("I listened!");
         }  
        });
    }
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent arg0) {

     System.out.println("onTouchEvent happened!");        
        super.onTouchEvent(arg0);

        return super.onTouchEvent(arg0);
        }

    public void onClick(){
     System.out.println("onClick entered!");
    }    
}

Ответы [ 4 ]

10 голосов
/ 11 февраля 2014

Я знаю, что это довольно старый вопрос, но:

mMapView.getMap().setOnMapClickListener(new OnMapClickListener()
                {
                    @Override
                    public void onMapClick(LatLng arg0)
                    {
                        android.util.Log.i("onMapClick", "Horray!");
                    }
                });

Подойдет.

6 голосов
/ 23 декабря 2010

Добавьте Overlay в свой вид карты и обработайте OnTouchEvent.Попробуйте что-то вроде этого:

public class MyMapActivity extends MapActivity {

class MapOverlay extends com.google.android.maps.Overlay
{       
    @Override
    public boolean onTouchEvent(MotionEvent e, MapView mapView) 
    {   
        if (e.getAction() == MotionEvent.ACTION_UP) {                
            GeoPoint p = mapView.getProjection().fromPixels(
                (int) e.getX(),
                (int) e.getY());
            MyMapActivity this.startActivityForResult(intent, requestCode);
        }                            
        return false;
    }        
}

      // MyMapActivity methods
      @Override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mapView = (MapView) findViewById(R.id.mapview);

        MapOverlay mapOverlay = new MapOverlay();
        List<Overlay> listOfOverlays = mapView.getOverlays();
        listOfOverlays.clear();
        listOfOverlays.add(mapOverlay);
  }
}
0 голосов
/ 29 октября 2012

Я бы предпочел переопределить метод onTap.

class MapOverlay extends Overlay
{       
  @Override
    public boolean onTap(GeoPoint p, MapView mapView) {
        //DO YOUR STUFF
        return super.onTap(p, mapView);
    }
}

В событии onTouch вы должны самостоятельно определить вкладку , ожидая MotionEvent.ACTION_DOWN и MotionEvent.ACTION_UP. И вы должны отфильтровать MotionEvent.ACTION_MOVE, чтобы не выполнять свои действия, пока пользователь просто перемещает карту.

Фильтрация события перемещения может привести к проблемам при разработке и для более старых версий Android. Во время тестирования событие перемещения будет добавлено в мой телефон Android 2.3.3, даже если я не переместил карту. Поэтому я не мог различить обычный щелчок ( вниз и вверх ) и движение ( вниз, движение и вверх )

0 голосов
/ 10 мая 2012

Я использовал что-то похожее на ответ kgiannakakis с внутренним классом MapOverlay, но я перегрузил метод OnTap (), чтобы предоставить Exit_Dialog для закрытия действия. Эта реализация по-прежнему позволяет управлять масштабированием и перетаскиванием в MapView, не затрагивая элемент управления Overlay. Но вы должны использовать mMapView.getContext () в конструкции AlertDialog.Builder. Смотрите код:

public class TripDataMapActivity extends MapActivity { 

    ....
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mapview_activity);

        // Set result CANCELED in case the user backs out
        setResult(Activity.RESULT_CANCELED);

        mMapView = (MapView)findViewById(R.id.mapview);
        mMapView.setBuiltInZoomControls(true);

        mMapCntrl = mMapView.getController();
        mMapCntrl.setZoom(14);  // World View is Zoom 1            

        // Set-up Drawable Overlays
        mMapOverlays = mMapView.getOverlays();
        mMapOverlays.clear();
        mDrawable = this.getResources().getDrawable(R.drawable.direction_arrow);
        mItemizedOverlay = new MyItemizedOverlays(mDrawable);
        updateMapView();
    }
    .....

    protected void updateMapView() { 
        // Convert Location into GeoPoint.
        int lat = (int)(locatn.getLatitude() * 1E6);  
        int lng = (int)(locatn.getLongitude() * 1E6); 
        GeoPoint point = new GeoPoint(lat, lng);
        OverlayItem overlayitem = new OverlayItem(point, "someTitle!", "someSnippet!");
        mMapCntrl.setCenter(point); 

        mItemizedOverlay.addOverlay(overlayitem);
        mMapOverlays.add(mItemizedOverlay);
        mMapView.invalidate();
    }
    ....
    // Inner Class Implementation 
    class MyItemizedOverlays extends ItemizedOverlay<OverlayItem> {

    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 

    public MyItemizedOverlays(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));
    }

    @Override
    protected OverlayItem createItem(int ith) { return mOverlays.get(ith); }

    @Override
    public int size() { return mOverlays.size(); }

    public void addOverlay(OverlayItem overlay) {
    mOverlays.add(overlay);
    populate();  // will call createItem(int) above 
    }

    @Override
    protected boolean onTap(int index) {

    // EXIT Dialog
    AlertDialog.Builder exitDialog = 
            new AlertDialog.Builder(mMapView.getContext());
        exitDialog.setMessage("Are you sure you want to Exit?")
                          .setCancelable(false)
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int id) {

            Intent intent = new Intent();
            //intent.putExtra(EXTRA_DEVICE_ADDRESS, address);
            // Set result and finish this Activity
            setResult(Activity.RESULT_OK, intent);

            TripDataMapActivity.this.finish();
            }
        }).setNegativeButton("No", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
               }
        });
        exitDialog.show();

    return true;
    }
    // End of Inner Class
}

}     
...