osmdroid 自定义信息 window 不接受更改
osmdroid custom info window not accepting changes
我正在为我的 osmdroid 标记(OSMDroid 版本 6.0.3)使用自定义 InfoWindow 布局
标记是这样添加的:
for(int i=0;i<10;i++){
GeoPoint startPoint = new GeoPoint(Double.parseDouble(lat_lon[0]), Double.parseDouble(lat_lon[1]));
Marker startMarker = new Marker(map);
startMarker.setPosition(startPoint);
InfoWindow infoWindow = new MyInfoWindow(R.layout.listview_layout, map,device);
startMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
startMarker.setInfoWindow(infoWindow);
startMarker.setId(Integer.toString(i));
startMarker.setOnMarkerClickListener(new Marker.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker, MapView mapView) {
int d_id=Integer.parseInt(marker.getId());
start_details(items.get(d_id));
return true;
}
});
map.getOverlays().add(startMarker);
startMarker.showInfoWindow();
}
我的自定义 InfoWindow 是我的 activity 的内部 class,定义为:
private class MyInfoWindow extends InfoWindow{
public int index=0;
private datalogger de=null;
public MyInfoWindow(int layoutResId, MapView mapView,datalogger dev) {
super(layoutResId, mapView);
de=dev;
}
public void onClose() {
}
public void onOpen(Object arg0) {
LayoutInflater l=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
LinearLayout myRoot = new LinearLayout(getBaseContext());
View v=l.inflate(R.layout.listview_layout,myRoot,false);
TextView moreinfo=v.findViewById(R.id.details_txt);
TextView name=v.findViewById(R.id.name_txt);
name.setText(de.name);
}
在 运行 我的应用程序之后,InfoWindows 出现了,但其中的元素具有来自 android 工作室设计师的预定义值。我也尝试直接使用 findViewById()
(而不是使用 layoutinflater),但是 returns 是一个空值。
您的 onOpen
方法扩充了新布局,为该布局中的文本视图设置了值...然后完成了让垃圾收集器删除的布局。布局没有附加到视图层次结构(因为 myRoot
不是视图层次结构的一部分)所以它不会显示在任何地方。
InfoWindow 实际上会膨胀并为您创建其视图层次结构。您可以通过受保护的字段mView
.
访问它
所以你的onOpen方法可以这样写:
public void onOpen(Object arg0) {
TextView moreinfo=mView.findViewById(R.id.details_txt);
TextView name=mView.findViewById(R.id.name_txt);
name.setText(de.name);
}
如需更多信息,您可以查看 the source code of the InfoWindow class。
我正在为我的 osmdroid 标记(OSMDroid 版本 6.0.3)使用自定义 InfoWindow 布局
标记是这样添加的:
for(int i=0;i<10;i++){
GeoPoint startPoint = new GeoPoint(Double.parseDouble(lat_lon[0]), Double.parseDouble(lat_lon[1]));
Marker startMarker = new Marker(map);
startMarker.setPosition(startPoint);
InfoWindow infoWindow = new MyInfoWindow(R.layout.listview_layout, map,device);
startMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
startMarker.setInfoWindow(infoWindow);
startMarker.setId(Integer.toString(i));
startMarker.setOnMarkerClickListener(new Marker.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker, MapView mapView) {
int d_id=Integer.parseInt(marker.getId());
start_details(items.get(d_id));
return true;
}
});
map.getOverlays().add(startMarker);
startMarker.showInfoWindow();
}
我的自定义 InfoWindow 是我的 activity 的内部 class,定义为:
private class MyInfoWindow extends InfoWindow{
public int index=0;
private datalogger de=null;
public MyInfoWindow(int layoutResId, MapView mapView,datalogger dev) {
super(layoutResId, mapView);
de=dev;
}
public void onClose() {
}
public void onOpen(Object arg0) {
LayoutInflater l=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
LinearLayout myRoot = new LinearLayout(getBaseContext());
View v=l.inflate(R.layout.listview_layout,myRoot,false);
TextView moreinfo=v.findViewById(R.id.details_txt);
TextView name=v.findViewById(R.id.name_txt);
name.setText(de.name);
}
在 运行 我的应用程序之后,InfoWindows 出现了,但其中的元素具有来自 android 工作室设计师的预定义值。我也尝试直接使用 findViewById()
(而不是使用 layoutinflater),但是 returns 是一个空值。
您的 onOpen
方法扩充了新布局,为该布局中的文本视图设置了值...然后完成了让垃圾收集器删除的布局。布局没有附加到视图层次结构(因为 myRoot
不是视图层次结构的一部分)所以它不会显示在任何地方。
InfoWindow 实际上会膨胀并为您创建其视图层次结构。您可以通过受保护的字段mView
.
所以你的onOpen方法可以这样写:
public void onOpen(Object arg0) {
TextView moreinfo=mView.findViewById(R.id.details_txt);
TextView name=mView.findViewById(R.id.name_txt);
name.setText(de.name);
}
如需更多信息,您可以查看 the source code of the InfoWindow class。