마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

android 구글맵 터치이벤트

0 추천

안드로이드 맵을 연동하고 제가 터치한 위치의 위도와 경도가 표시되게 하고 싶은데요.  소스 부분에는 에러는 없지만 실행을 하면 종료가 됩니다. 해결방법을 몇일째 고민하고 있는데 잘 모르겠어서 이렇게 글을 올립니다, 

소스 부분입니다.

package com.example.kim;

import java.util.List;

import android.annotation.SuppressLint;
import android.app.Activity;

import android.graphics.*;
import android.location.Location;
import android.os.Bundle;
import com.example.kim.R;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;
import com.google.android.maps.*;


import android.text.InputType;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends MapActivity  implements View.OnClickListener   {
	
	static final LatLng position = new LatLng(37.509509,126.898368);
	private double lat;
	private double lng;
	private LatLng position1;
	EditText ed1, ed2;
	Button bt1, bt2;
	private GoogleMap map;
	private Marker Marker;
	private Marker Marker1;
	MapView mapView;
	MapController mc;
	GeoPoint p;
	

	
	@SuppressLint({"NewApi","NewApi"})
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		map = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap(); 
		Marker = map.addMarker(new MarkerOptions().position(position).icon(BitmapDescriptorFactory.fromResource(R.drawable.star3)));
		map.moveCamera(CameraUpdateFactory.newLatLngZoom(position,17));
		
		bt1 = (Button)findViewById(R.id.button1);
		bt1.setOnClickListener(this);
		bt2 = (Button)findViewById(R.id.button2);
		bt2.setOnClickListener(this);
		
		mapView.displayZoomControls(true);
		mc = mapView.getController();
	    String coordinates[] = {"37.509509", "126.898368"};
	    double lat = Double.parseDouble(coordinates[0]);
	    double lng = Double.parseDouble(coordinates[1]);
		
        p = new GeoPoint((int)(lat*1E6), (int)(lng*1E6));
        mc.animateTo(p);
        mc.setZoom(17); 
		
		MapOverlay mapOverlay = new MapOverlay();
		List<Overlay> listOverlay = mapView.getOverlays();;
		listOverlay.clear();
		listOverlay.add(mapOverlay);
		
		mapView.invalidate();
		
		
	}
	
	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}

	
	class MapOverlay extends com.google.android.maps.Overlay {
		@Override
		public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when){
			super.draw(canvas, mapView, shadow);
			Point screenPoint = new Point();
			mapView.getProjection().toPixels(p, screenPoint);
			
			Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.star3);
			Paint paint = new Paint();
			paint.setAlpha(60);
			canvas.drawBitmap(bmp, screenPoint.x-bmp.getWidth()/2,  screenPoint.y,  paint);
			return true;
			
		}
		
		@Override
		public boolean onTouchEvent(MotionEvent event, MapView mapView){
			if(event.getAction() == event.ACTION_UP) {
				GeoPoint p = mapView.getProjection().fromPixels((int) event.getX(),(int) event.getY());
				android.util.Log.e("좌표", "위도:"+p.getLatitudeE6()+", 경도:"+p.getLongitudeE6());
				//mapView.getController().animateTo(p);
				//Toast.makeText(getBaseContext(), p.getLatitudeE6() / 1E6 + "," + p.getLongitudeE6() / 1E6 , Toast.LENGTH_SHORT).show();
				return true;
			}
			else return false;
		}
		
	}
	
	public void remove(){
		map.clear();
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	/*
	public void clickButton(View v) {
		if( v.getId() == R.id.button1 ) {
			remove();
			Marker = map.addMarker(new MarkerOptions().position(position));
	        map.moveCamera(CameraUpdateFactory.newLatLngZoom(position,17));
	    }
	    else if(v.getId() == R.id.button2) {
	    	LatLng position1 = new LatLng(lat, lng);
			ed1 = (EditText)findViewById(R.id.EditText1);
			ed2 = (EditText)findViewById(R.id.EditText2);
			lat = Double.parseDouble(ed1.getText().toString());
			lng = Double.parseDouble(ed2.getText().toString());
			remove();
			Marker = map.addMarker(new MarkerOptions().position(position1));
	        map.moveCamera(CameraUpdateFactory.newLatLngZoom(position1,7));
	        break;
	    }
	}
	*/
	
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch(v.getId()){
		case R.id.button1:
			remove();
			Marker = map.addMarker(new MarkerOptions().position(position).icon(BitmapDescriptorFactory.fromResource(R.drawable.star3)));
	        map.moveCamera(CameraUpdateFactory.newLatLngZoom(position,17));
	        break;
		case R.id.button2:
			LatLng position1 = new LatLng(lat, lng);
			ed1 = (EditText)findViewById(R.id.EditText1);
			ed2 = (EditText)findViewById(R.id.EditText2);
			lat = Double.parseDouble(ed1.getText().toString());
			lng = Double.parseDouble(ed2.getText().toString());
			remove();
			Marker = map.addMarker(new MarkerOptions().position(position1).icon(BitmapDescriptorFactory.fromResource(R.drawable.star5)));
	        map.moveCamera(CameraUpdateFactory.newLatLngZoom(position1,7));
	        break;
		}	
	}

	
	
}

LogCat 부분도 올려봅니다.

익명사용자 님이 2013년 8월 18일 질문

1개의 답변

0 추천
mapView 가 null point exception 이군요
aucd29 (218,390 포인트) 님이 2013년 8월 19일 답변
어떻게 수정하면 좋을까요... ㅠ_ㅠ
(Button)findViewById(R.id.button1); 이렇게 하신 것 처럼
mapView  도 하셔야 합니다. mapView 에 해당하는 코드가 없어요
...