android mapview点击问题

S529586243 2012-06-01 03:52:38
我的地图上有许多标记的点,点击每个点时会弹出一个view,当我第一次加载地图的时候显示所有的标记的点,这个时候点击任何点并且弹出view都是没问题的,这时我随便点击地图中的一个标记,弹出一个view,当我输入查询条件,显示部分标记点的时候,如果再点击地图上的任何位置,都会报错,
06-01 15:54:17.341: E/AndroidRuntime(8457): FATAL EXCEPTION: main
06-01 15:54:17.341: E/AndroidRuntime(8457): java.lang.ArrayIndexOutOfBoundsException
06-01 15:54:17.341: E/AndroidRuntime(8457): at com.google.android.maps.ItemizedOverlay.maskHelper(ItemizedOverlay.java:562)
06-01 15:54:17.341: E/AndroidRuntime(8457): at com.google.android.maps.ItemizedOverlay.setFocus(ItemizedOverlay.java:365)
06-01 15:54:17.341: E/AndroidRuntime(8457): at com.google.android.maps.ItemizedOverlay.focus(ItemizedOverlay.java:539)
06-01 15:54:17.341: E/AndroidRuntime(8457): at com.google.android.maps.ItemizedOverlay.onTap(ItemizedOverlay.java:455)
06-01 15:54:17.341: E/AndroidRuntime(8457): at com.google.android.maps.OverlayBundle.onTap(OverlayBundle.java:83)
06-01 15:54:17.341: E/AndroidRuntime(8457): at com.google.android.maps.MapView$1.onSingleTapUp(MapView.java:347)
06-01 15:54:17.341: E/AndroidRuntime(8457): at com.google.android.maps.GestureDetector.onTouchEvent(GestureDetector.java:533)
06-01 15:54:17.341: E/AndroidRuntime(8457): at com.google.android.maps.MapView.onTouchEvent(MapView.java:647)
06-01 15:54:17.341: E/AndroidRuntime(8457): at android.view.View.dispatchTouchEvent(View.java:3766)
06-01 15:54:17.341: E/AndroidRuntime(8457): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897)
06-01 15:54:17.341: E/AndroidRuntime(8457): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
06-01 15:54:17.341: E/AndroidRuntime(8457): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
06-01 15:54:17.341: E/AndroidRuntime(8457): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
06-01 15:54:17.341: E/AndroidRuntime(8457): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1735)
06-01 15:54:17.341: E/AndroidRuntime(8457): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1121)
06-01 15:54:17.341: E/AndroidRuntime(8457): at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
06-01 15:54:17.341: E/AndroidRuntime(8457): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1719)
06-01 15:54:17.341: E/AndroidRuntime(8457): at android.view.ViewRoot.handleMessage(ViewRoot.java:1788)
06-01 15:54:17.341: E/AndroidRuntime(8457): at android.os.Handler.dispatchMessage(Handler.java:99)
06-01 15:54:17.341: E/AndroidRuntime(8457): at android.os.Looper.loop(Looper.java:123)
06-01 15:54:17.341: E/AndroidRuntime(8457): at android.app.ActivityThread.main(ActivityThread.java:4627)
06-01 15:54:17.341: E/AndroidRuntime(8457): at java.lang.reflect.Method.invokeNative(Native Method)
06-01 15:54:17.341: E/AndroidRuntime(8457): at java.lang.reflect.Method.invoke(Method.java:521)
06-01 15:54:17.341: E/AndroidRuntime(8457): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:863)
06-01 15:54:17.341: E/AndroidRuntime(8457): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:621)
06-01 15:54:17.341: E/AndroidRuntime(8457): at dalvik.system.NativeStart.main(Native Method)




private void initMap(){
//地图
mapView = (MapView) findViewById(R.id.map_view1);
mapView.setClickable(true);
mapView.setBuiltInZoomControls(true);
mapCtrl = mapView.getController();
//设置地图缩放的级别
mapCtrl.setZoom(12);
initPopView();

//地图悬浮层
Drawable storeMark = this.getResources().getDrawable(R.drawable.pin);
Drawable myMark = this.getResources().getDrawable(R.drawable.pin_my);
storeOverlay = new StoreItemizedOverlay(storeMark, this, mapView, popView, mapCtrl, true);
myOverlay = new StoreItemizedOverlay(myMark, this, mapView, popView, mapCtrl, false);
}

//初始化地址信息框
private void initPopView(){
if(popView == null){
popView = getLayoutInflater().inflate(R.layout.overlay_popup, null);
mapView.addView(popView
, new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT
,MapView.LayoutParams.WRAP_CONTENT
,null
,MapView.LayoutParams.BOTTOM_CENTER
));
//默认为隐藏状态
popView.setVisibility(View.GONE);
}
}
...全文
457 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
samking1124 2012-08-14
  • 打赏
  • 举报
回复
找到一个解决办法
private void doPopulate(){
setLastFocusedIndex(-1);
populate();
}
在原来调用populate()方法地方调用 目前测试未发现问题
samking1124 2012-08-14
  • 打赏
  • 举报
回复
同被此问题困扰 ,很郁闷的问题
lijianpu 2012-08-13
  • 打赏
  • 举报
回复
等我明天上班帮你解决,困了睡觉
S529586243 2012-06-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
你在做操作的时候出错了,ArrayIndexOutOfBoundsException
你最好检查下你的操作代码,
[/Quote]
我晓得是索引越界问题,但是不知道为什么会越界,难道是我查询的时候没有清空什么东西吗?
弱弱的问一句:什么是"弱引用"
huage 2012-06-01
  • 打赏
  • 举报
回复
感觉是不是资源加载太多出问题了,是不是弱引用
huage 2012-06-01
  • 打赏
  • 举报
回复
你在做操作的时候出错了,ArrayIndexOutOfBoundsException
你最好检查下你的操作代码,
S529586243 2012-06-01
  • 打赏
  • 举报
回复
补充
//查询按钮
btnSearch.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {

try{
pb.show();
storeOverlay.clearOverlay();
storeOverlay.setFocus(null);
myOverlay.clearOverlay();
myOverlay.setFocus(null);
popView = getLayoutInflater().inflate(R.layout.overlay_popup, null);
//默认为隐藏状态
popView.setVisibility(View.GONE);
ShowStoreMarkAsyncTask task=new ShowStoreMarkAsyncTask();
task.execute();
//显示我的位置
showMyLocation();
}catch (Exception e){
e.printStackTrace();
}

}
});





/*
* 图表层,负责google地图上面的图标显示
*
* */
public class StoreItemizedOverlay extends ItemizedOverlay<OverlayItem>
implements OnClickListener{

//overlay列表
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
//显示的内容
Context mContext;
private MapView mMapView;
private MapController mMapCtrl;
private View mPopView;
private int layout_x = 0; // 用于设置popview 相对某个位置向x轴偏移
private int layout_y = 50; // 用于设置popview 相对某个位置向x轴偏移
private Drawable itemDrawable;
private GeoPoint point = null;
private boolean isStore = false;
private String tel = "";

/**
* 初始化
* @param defaultMarker
* @param context
* @param mapView
* @param popView
* @param mapCtrl
* @param store
*/
public StoreItemizedOverlay(Drawable defaultMarker, Context context, MapView mapView, View popView, MapController mapCtrl, boolean store) {
super(boundCenterBottom(defaultMarker));
itemDrawable = defaultMarker;
mContext = context;
layout_x = itemDrawable.getBounds().centerX();
layout_y = layout_y - itemDrawable.getBounds().height();
mMapView = mapView;
mPopView = popView;
mMapCtrl = mapCtrl;
isStore = store;
mMapView.setFocusable(true);
}
//初始化
public StoreItemizedOverlay(Drawable defaultMarker) {
//继承父类
super(boundCenterBottom(defaultMarker));
}

public void clearOverlay(){
mOverlays = new ArrayList<OverlayItem>();
mOverlays.clear();
mOverlays.trimToSize();
//mPopView=null;
populate();
}

//添加overlay图层
public void addOverlay(OverlayItem overlay) {
mOverlays.trimToSize();
mOverlays.add(overlay);

populate();
}

//当用户点击标记时所调用的函数
@Override
protected boolean onTap(int index) {
mOverlays.trimToSize();
if(index >= mOverlays.size()){
return false;
}
OverlayItem item = mOverlays.get(index);
//获得地址框信息
MapView.LayoutParams params = (MapView.LayoutParams) mPopView.getLayoutParams();
//获得点击标记的坐标,并设置地址框的坐标为该坐标
point = item.getPoint();
params.x = this.layout_x;//Y轴偏移
params.y = this.layout_y;//Y轴偏移
params.point = point;
//获得信息框的title
TextView title_TextView = (TextView) mPopView.findViewById(R.id.map_bubbleTitle);
title_TextView.setText(item.getTitle());
TextView desc_TextView = (TextView) mPopView.findViewById(R.id.map_bubbleText);
desc_TextView.setText(item.getSnippet());
//添加地址框电话点击事件
ImageButton button = (ImageButton) mPopView.findViewById(R.id.btnmaptel);
button.setOnClickListener(this);
//添加地址框信息点击事件
ImageButton buttonMsg = (ImageButton) mPopView.findViewById(R.id.btnmapmeg);
buttonMsg.setOnClickListener(this);
tel = "";
button.setVisibility(View.GONE);
buttonMsg.setVisibility(View.GONE);
if(mContext.getClass().getName().equals("com.indeed.mobile.storemap")){

//取得该电话号
if(((storemap) mContext).storelist != null && ((storemap) mContext).storelist.size() > index && isStore){
tel = ((storemap) mContext).storelist.get(index).getTel();
button.setVisibility(View.VISIBLE);
buttonMsg.setVisibility(View.VISIBLE);
}
}
//电话
button.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
Uri uri = Uri.parse("tel:" + tel);
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
mContext.startActivity(intent);
}

});
//短信
buttonMsg.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
Uri smsToUri = Uri.parse("smsto:" + tel);
Intent mIntent = new Intent( android.content.Intent.ACTION_SENDTO, smsToUri );
mContext.startActivity( mIntent );
}

});
mMapView.updateViewLayout(mPopView, params);
mPopView.setVisibility(View.VISIBLE);
//地图转移到该点
mMapCtrl.animateTo(point);
return true;
}

//必须继承的基类
//添加overlay
@Override
protected OverlayItem createItem(int i) {
mOverlays.trimToSize();
return mOverlays.get(i);
}

//返回overlay存在的对象
@Override
public int size() {
mOverlays.trimToSize();
return mOverlays.size();
}

@Override
public void onClick(View v) {
mContext.startActivity( mIntent );
}
}

58,454

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧