Schreiben von MarkerInfoWindow für Osmdroid

    Dieser Artikel richtet sich an Personen, die Schwierigkeiten haben, infoWindow mit osmdroid zu verbinden und mit AsyncTask zu arbeiten. Hier habe ich darüber geschrieben, wie ich ein Fenster zum Empfangen von Daten über ein Auto im Transportüberwachungsdienst erstellt habe.
    Unter dem Strich werden beim Klicken auf die Markierung einige Daten aus dem Objekt entnommen, andere Daten aus der API geladen, in die Anwendungsdatenbank geschrieben und dann im InfoWindow-Objekt angezeigt.

    Zunächst erstellen wir eine XML-Datei mit der Beschreibung von infoWindow und fügen Felder mit den Überschriften der Transportkriterien hinzu.

    Bild
    Mit MarkerInfoWindow können Sie in Title, Description, Subdescription, I nur Descripton für alle erforderlichen Datensätze aufzeichnen. Wir werden die Daten anschließend als String mit Bindestrichen dorthin übertragen.

    Das Markup sieht wie folgt aus:



    Als Nächstes schreiben wir unsere CarInfoWindow-Klasse, um die erforderlichen Daten anzuzeigen:
    public class CarInfoWindow extends MarkerInfoWindow {
        Car mCar;
        Marker mMarker;
        CarInfoTask carInfoTask;
        Boolean stopped = false;
        Drawable icon;
        String active;
        public CarInfoWindow(int layoutResId, MapView mapView) {
            super(layoutResId, mapView);
        }
        //при открытии запускаем asyncTask
        @Override
        public void onOpen(final Object item) {
            if (!stopped) {
                carInfoTask = new CarInfoTask();
                carInfoTask.execute(item);
            }
            super.onOpen(item);
        }
        //при закрытии можем поменять иконку маркера
        @Override
        public void onClose() {
            stopped = false;
            super.onClose();
            if (!(mCar.getLastUpdate() == null)) {
                if (((System.currentTimeMillis() - Long.parseLong(mCar.getLastUpdate())) / 3600000) > 1) {
                    active = "0"; //car is not active
                }
                else {
                    active = "1";
                }
            }
            String fileName = Environment.getExternalStorageDirectory()+"/automap/cars/icons/"+mCar.getIconIndex()+"/"+active+"/icon.png";
            icon = Utils.loadIcon(fileName, Float.parseFloat(mCar.getDirection()), mCar.getIconType());
            mMarker.setIcon(icon);
        }
        class CarInfoTask extends AsyncTask {
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }
            @Override
            //операции по обработке данных производятся в этом методе
            protected Void doInBackground(Object... params) {
                try {
    		//задаем нужный маркер, к которому привязан объект Car с нужными данными
                    mMarker = (Marker)params[0];
                    mCar = (Car) mMarker.getRelatedObject();
    		//Данные, которые нужно передать в infoWindow
                    String markName;
                    String carModelName;
                    String groupName;
                    String carLastUpdate;
                    Context context = getView().getContext();
                    //берем token, и данные из объекта
                    Token token = Prefs.getToken(getView().getContext());
                    String markId = mCar.getMarkId();
                    String modelId = mCar.getModelId();
                    String orgId = mCar.getOrganizationId();
                    String groupId = mCar.getGroupId();
                    carLastUpdate = mCar.getLastUpdate();
    		//что-нибудь делаем
                    String formattedDate = "";
                    if (!(carLastUpdate == null)) {
                        long unixSeconds = Long.parseLong(carLastUpdate);
                        Date date = new Date(unixSeconds);
                        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy  HH:mm:ss ");
                        formattedDate = sdf.format(date);
                    }
                    String organizationName = DbHelper.getInstance(context).getOrganizationStatById(orgId).getName();
                    List marksList = null;
                    List carModelsList = null;
                    List groupsList = null;
                    //делаем запрос в API, берем mark и model по id
                    try {
                        //используем retrofit
                        carModelsList = Api.getService(context).getModels(token.getValue(), markId); 
                        int size = carModelsList.size();
                        for (int i=0; i



    Теперь при создании маркера остается всего лишь к маркеру привязать нужное окно

    marker.setInfoWindow(infoWindow);
    


    В результате проделанных манипуляций получаем нечто вроде:

    image

    P.S. Несмотря на то, что маркер — иконка грузовика, а в описании это Alfa Romeo, всё работает верно.

    Jetzt auch beliebt: