Пользовательское информационное окно osmdroid не принимает изменения - PullRequest
0 голосов
/ 07 января 2019

Я использую пользовательский макет InfoWindow для моих маркеров osmdroid (OSMDroid версия 6.0.3)
Маркеры добавляются так:

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 является внутренним классом моей деятельности и определяется как:

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), но это возвращает нулевое значение.

1 Ответ

0 голосов
/ 07 января 2019

Ваш метод 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);
}

Для получения более подробной информации вы можете проверить исходный код класса InfoWindow .

...