【问题标题】:OSMBonusPack Markers doesn't display bubble after switching to landscapeOSMBonusPack 标记在切换到横向后不显示气泡
【发布时间】:2014-04-22 16:06:47
【问题描述】:

这是我的问题...它可能很简单,但我被困住了:

上下文

我有一些从 Internet 下载的信息(文本和小图像),当我点击 myMarkers 类时,我想将其显示在气泡内。我希望这项工作既适用于景观,也适用于非景观。

问题

当应用程序是纵向的并且当我终止应用程序并重新运行它时,一切正常(当我点击时,我看到带有文本和 img 的气泡)。 当我转向横向并且我的应用程序不可见但还活着时,地图会恢复标记,但是当我点击它们时,它们不会显示气泡。

代码

这里是我的 Marker 实现,它实现了Parcelable,以便在我调用onSaveInstanceState 时将它们保存到Bundle 中,当我的Activity 进入onPause() 时(省略空覆盖方法):

class myMarker extends Marker implements Parcelable{

            public myMarker(MapView mapView) {
                    super(mapView);
            }

            public  Parcelable.Creator<myMarker> CREATOR = new Parcelable.Creator<myMarker>() {

            public myMarker createFromParcel(Parcel in) {
                return new myMarker(map);
            }

            public myMarker[] newArray(int size) {
                return new myMarker[size];
            }
            };

}

在我们拥有的 Activity 中的 onCreate() 内:

 if (savedInstanceState != null) {
    // Restore myMarkers
    markers = savedInstanceState.getParcelableArrayList("MARKERS");
    for (int i=0;i<markers.size();i++){                  
         map.getOverlays().add(markers.get(i));
         Marker m=markers.get(i);

            }
         map.invalidate();
        } 
 else {
    markers=new ArrayList<myMarker>();
        }

以及保存过程:

@Override
      public void onSaveInstanceState(Bundle savedInstanceState) {
          // Save the user's current state
          savedInstanceState.putParcelableArrayList("MARKERS", markers);

          // Always call the superclass so it can save the view hierarchy state
          super.onSaveInstanceState(savedInstanceState);
      }

我做错了什么?我错过了什么? 谢谢

【问题讨论】:

    标签: android map android-activity openstreetmap osmdroid


    【解决方案1】:

    我解决了

    我认为有一个问题。每次您将设备设置为横向时,MarkerMarkerInfoWindow 都会对 Context 进行旧引用,这就是为什么单击时不会显示气泡的原因。 (也许可以使用碎片修复...)

    只需重写类,在重新创建标记时,您只需将新引用传递给上下文。

    代码:

    public class myMarker extends Marker implements Parcelable{
        InfoWindow i;
        MapView map;
        static Context context=null;
        static MarkerInfoWindow ma=null;
    
    
    
        public myMarker(MapView mapView) {
        super(mapView);
        Context c=mapView.getContext();
       /*IF THE CONTEXT CHANGES, I KEEP MY NEW (RECREATED) mapView AND I SET A NEW static 
       MarkerInfoWindow OTHERWISE AT ANY CASE I SET THE static markerInfoWindow TO THE MARKER */
        if(context==null||context!=c){
        i=super.mInfoWindow;
        map=mapView;
        context=c;
        String packageName=context.getPackageName();
        int layoutResId=context.getResources().getIdentifier("layout/bonuspack_bubble",null,packageName);
        ma=new MarkerInfoWindow(layoutResId, mapView);
        }
        super.setInfoWindow(ma);
    
    
    }
    ...
    }
    

    还有 onRestore,当你在横向重新加载地图时,在 onSave 之后:

    /*@ onRestore i keep my old markers and i create new markers with same info but with new mapView(new Context)*/
          @Override
          protected void onRestoreInstanceState(Bundle savedInstanceState){                
          super.onRestoreInstanceState(savedInstanceState);
    
                  if (savedInstanceState != null) {
    
    
                      /*NEW MARKERS EQUALS TO THE OLD BUT WITH NEW MAP (NEW CONTEXT)
                      ...AND NO YOU CANT JUST UPDATE THE CONTEXT*/
    
                       ArrayList<myMarker> markers2;
                        markers2 = savedInstanceState.getParcelableArrayList("MARKERS");
    
                        if(markers2!=null){
                       for (int i=0;i<markers2.size();i++){
                           myMarker m=new myMarker(map);
                           m.setTitle(markers2.get(i).getTitle());
                           m.setImage(markers2.get(i).getImage());
                           m.setPosition(markers2.get(i).getPosition());
                           m.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
                           markers.add(m);
    
                                map.getOverlays().add(m);
    
    
                             }
                        }
    
    
                            map.invalidate();                  
                 }
    
                    else markers=new ArrayList<myMarker>();  
    
    
    
    
          }
    

    【讨论】:

      【解决方案2】:

      好吧,我确认,您在 OSMBonusPack 标记中发现了一个问题(我是开发人员) => 静态 MarkerInfoWindow mDefaultInfoWindow 不支持 MapView 更改。

      您找到了一个示例:更改方向,您的构造函数似乎是修复它的好方法。

      但还有其他情况:在同一个应用程序中有多个 MapView。更复杂。

      我将尝试直接在库中解决该问题。 您可以在项目问题(issue #58)中关注进度。

      【讨论】:

      • 好的,感谢很棒的库,因为它是免费的。我会关注这个问题,我也在谷歌群组上发帖!谢谢!
      猜你喜欢
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      相关资源
      最近更新 更多