Android 为什么弹出窗口不工作?

Android 为什么弹出窗口不工作?,android,google-maps,Android,Google Maps,我使用的是android google map,地图上有不同的pin,还有nam和close按钮以及move按钮。地图上会显示弹出窗口,但当单击另一个pin时,会出现异常,如下所示:- 10-06 22:17:17.080: E/AndroidRuntime(25156): FATAL EXCEPTION: main 10-06 22:17:17.080: E/AndroidRuntime(25156): java.lang.IllegalStateException: The specifie

我使用的是android google map,地图上有不同的pin,还有nam和close按钮以及move按钮。地图上会显示弹出窗口,但当单击另一个pin时,会出现异常,如下所示:-

10-06 22:17:17.080: E/AndroidRuntime(25156): FATAL EXCEPTION: main
10-06 22:17:17.080: E/AndroidRuntime(25156): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
10-06 22:17:17.080: E/AndroidRuntime(25156):    at android.view.ViewGroup.addViewInner(ViewGroup.java:3011)
10-06 22:17:17.080: E/AndroidRuntime(25156):    at android.view.ViewGroup.addView(ViewGroup.java:2900)
10-06 22:17:17.080: E/AndroidRuntime(25156):    at android.view.ViewGroup.addView(ViewGroup.java:2880)
10-06 22:17:17.080: E/AndroidRuntime(25156):    at com.appstudioz.bidnear.map.BidNearItemizedOverlay.onTap(BidNearItemizedOverlay.java:85)
10-06 22:17:17.080: E/AndroidRuntime(25156):    at com.google.android.maps.ItemizedOverlay.onTap(ItemizedOverlay.java:453)
10-06 22:17:17.080: E/AndroidRuntime(25156):    at com.google.android.maps.OverlayBundle.onTap(OverlayBundle.java:83)
10-06 22:17:17.080: E/AndroidRuntime(25156):    at com.google.android.maps.MapView$1.onSingleTapUp(MapView.java:356)
10-06 22:17:17.080: E/AndroidRuntime(25156):    at com.google.android.maps.GestureDetector.onTouchEvent(GestureDetector.java:533)
10-06 22:17:17.080: E/AndroidRuntime(25156):    at com.google.android.maps.MapView.onTouchEvent(MapView.java:683)
10-06 22:17:17.080: E/AndroidRuntime(25156):    at android.view.View.dispatchTouchEvent(View.java:4609)
 10-06 22:17:17.080: E/AndroidRuntime(25156):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1554)
10-06 22:17:17.080: E/AndroidRuntime(25156):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1320)
 10-06 22:17:17.080: E/AndroidRuntime(25156):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
 10-06 22:17:17.080: E/AndroidRuntime(25156):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
 10-06 22:17:17.080: E/AndroidRuntime(25156):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
  10-06 22:17:17.080: E/AndroidRuntime(25156):  at  android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
 10-06 22:17:17.080: E/AndroidRuntime(25156):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
 10-06 22:17:17.080: E/AndroidRuntime(25156):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
 10-06 22:17:17.080: E/AndroidRuntime(25156):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
 10-06 22:17:17.080: E/AndroidRuntime(25156):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
 10-06 22:17:17.080: E/AndroidRuntime(25156):   at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1732)
 10-06 22:17:17.080: E/AndroidRuntime(25156):   at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1267)
 10-06 22:17:17.080: E/AndroidRuntime(25156):   at android.app.Activity.dispatchTouchEvent(Activity.java:2315)
  10-06 22:17:17.080: E/AndroidRuntime(25156):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1705)
 10-06 22:17:17.080: E/AndroidRuntime(25156):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
  10-06 22:17:17.080: E/AndroidRuntime(25156):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
  10-06 22:17:17.080: E/AndroidRuntime(25156):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at  android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
  10-06 22:17:17.080: E/AndroidRuntime(25156):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1732)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1267)
    10-06 22:17:17.080: E/AndroidRuntime(25156):    at android.app.Activity.dispatchTouchEvent(Activity.java:2315)
    10-06 22:17:17.080: E/AndroidRuntime(25156):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1705)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at android.view.View.dispatchPointerEvent(View.java:4677)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2394)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at android.view.ViewRoot.handleMessage(ViewRoot.java:2054)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at android.os.Handler.dispatchMessage(Handler.java:99)
  10-06 22:17:17.080: E/AndroidRuntime(25156):  at android.os.Looper.loop(Looper.java:132)
  10-06 22:17:17.080: E/AndroidRuntime(25156):  at android.app.ActivityThread.main(ActivityThread.java:4123)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at java.lang.reflect.Method.invokeNative(Native Method)
  10-06 22:17:17.080: E/AndroidRuntime(25156):  at java.lang.reflect.Method.invoke(Method.java:491)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
   10-06 22:17:17.080: E/AndroidRuntime(25156):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
    10-06 22:17:17.080: E/AndroidRuntime(25156):    at dalvik.system.NativeStart.main(Native Method)
我将此代码用作:-我的Web服务提供具有lat、long和在地图上显示为的对象数:-

MapController objmapcontroller;
    GeoPoint objgeopointp;
    double lat, lng;
    try {
        lat = Double.parseDouble(latitude);
        lng = Double.parseDouble(longitude);
    } catch (Exception e) {
        e.printStackTrace();
        lat = lng = 0;
    }
    objgeopointp = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
    objmapcontroller = objmapView.getController();

    // ---Add a location marker---


    // create and add an OverlayItem to the MyItemizedOverlay list
    OverlayItem overlayitem = new OverlayItem(objgeopointp, title, snippet);
    itemizedoverlay.addOverlay(overlayitem);
    objmapcontroller.animateTo(objgeopointp);
    objmapcontroller.setZoom(16);
    // add the overlays to the map
    mapOverlays.add(itemizedoverlay);
    objmapView.invalidate();
我的覆盖类和Ontap方法中的一样,整个类是

private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
private Context mContext;
private MapView objmapview;
private View popUp;

public BidNearItemizedOverlay(Drawable defaultMarker, Context ctx,MapView objmapview,View popUp) {
    super(boundCenterBottom(defaultMarker));
    mContext =ctx;
    this.objmapview=objmapview;
    this.popUp=popUp;
}

public void addOverlay(OverlayItem overlay) {
    mOverlays.add(overlay);
    populate();
}

public void clear() {
    mOverlays.clear();
    populate();
}

@Override
protected OverlayItem createItem(int i) {

    return mOverlays.get(i);
}

@Override
public int size() {
    Log.e("------size--",""+mOverlays.size());
    return mOverlays.size();
}

@Override
protected boolean onTap(int index) {
     OverlayItem item=getItem(index);
      GeoPoint geo=item.getPoint();
      MapView.LayoutParams mapParams = new MapView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
            ViewGroup.LayoutParams.WRAP_CONTENT,
            geo,
            MapView.LayoutParams.BOTTOM_CENTER);
     TextView objtxt = (TextView)popUp.findViewById(R.id.textup);
     TextView objtxt2 = (TextView)popUp.findViewById(R.id.text2);
     objtxt.setText(item.getTitle());
     objtxt2.setText(item.getSnippet());
     ImageView objimg = (ImageView)popUp.findViewById(R.id.bluebutton);
     ImageButton objbtn = (ImageButton)popUp.findViewById(R.id.closebutton);
     objbtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            System.out.println("aclosehjdfd");
        }
    });
     objimg.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            System.out.println("hohodshfsdh");
        }
    });
    objmapview.addView(popUp, mapParams);
    return true;
}
private ArrayList mOverlays=new ArrayList();
私有上下文;
私有地图视图objmapview;
私有视图弹出窗口;
公共BidNearItemizeOverlay(可绘制的默认标记、上下文ctx、MapView objmapview、视图弹出窗口){
super(boundCenterBottom(defaultMarker));
mContext=ctx;
this.objmapview=objmapview;
this.popUp=popUp;
}
公共void addOverlay(OverlayItem overlay){
添加(覆盖);
填充();
}
公共空间清除(){
mOverlays.clear();
填充();
}
@凌驾
受保护的OverlayItem createItem(int i){
返回mOverlays.get(i);
}
@凌驾
公共整数大小(){
Log.e(“----size--”和“+mOverlays.size());
返回mOverlays.size();
}
@凌驾
受保护的布尔onTap(整数索引){
OverlayItem item=getItem(索引);
GeoPoint geo=item.getPoint();
MapView.LayoutParams mapParams=新建MapView.LayoutParams(ViewGroup.LayoutParams.WRAP_内容,
ViewGroup.LayoutParams.WRAP_内容,
geo,
地图视图。布局参数。底部(中间);
TextView objText=(TextView)popUp.findViewById(R.id.textup);
TextView objtxt2=(TextView)popUp.findViewById(R.id.text2);
setText(item.getTitle());
objtxt2.setText(item.getSnippet());
ImageView对象=(ImageView)popUp.findViewById(R.id.bluebutton);
ImageButton objbtn=(ImageButton)popUp.findViewById(R.id.closebutton);
objbtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
System.out.println(“aclosehjdfd”);
}
});
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
System.out.println(“HODSHFSDH”);
}
});
addView(弹出窗口,mapParams);
返回true;
}

请任何人向我建议如何实现此目标,谢谢提前..

您发送到BidnearItemizeOverlay的视图弹出窗口似乎已经有父视图了。当您调用addView(弹出窗口,mapParams)时,您正试图为其提供第二个父级。这是不允许的。如果确实要使用它,必须首先将其与其父级分离。最简单的解决方案可能是基于弹出窗口中的属性创建新视图,而不是使用实际视图

或者尝试:

((ViewGroup)popUp.getParent()).removeView(popUp);