这是我的问题…这可能很简单,但我卡住了:
<<p> 上下文/strong>我有一些信息,我从互联网(文本和小图片)下载,我想显示它里面的气泡当我点击myMarkers类。我希望这幅画既能风景画,也能不风景画。
当应用程序是纵向的,当我杀死应用程序并重新运行它时,一切都在工作(当我点击我看到带有文本和img的气泡)。当我切换到横向模式,当我的应用程序不可见但仍然存在时,地图会恢复标记,但当我点击它们时,它们不会显示气泡。
这里我的实现标记实现Parcelable
,以便将它们保存到Bundle
当我调用onSaveInstanceState
时,我的活动去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];
}
};
}
在活动的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);
}
我做错了什么?我错过了什么?由于
我决定
我认为有一个问题。每次你打开设备横向,Marker
的MarkerInfoWindow
有一个旧的参考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>();
}
我确认,您在OSMBonusPack Marker中发现了一个问题(我是开发人员)=>静态MarkerInfoWindow mDefaultInfoWindow不支持MapView更改。
您发现了一个例子:改变方向,您的构造函数似乎是修复它的好方法。
但是还有其他情况:在同一个应用程序中有多个MapView。更加复杂。
我将尝试直接在lib中修复这个问题。您可以在项目问题(第58期)中跟踪进度。