Вопрос

В iOS Вы можете легко установить вызов для своих маркеров, позвонив:

[marker setCanShowCallout:YES];
[marker setRightCalloutAccessoryView:YOUR_BUTTON];
.

Но я не могу найти эту функциональность для SDK Android Mapbox.Теперь у меня есть слушатель, который обнаруживает прикосновения к выношению, но как я могу установить изображение / кнопку Callout?

Marker marker = new Marker(p.getTitle(), p.getCatagoryName(), new LatLng(p.getLatitude(), p.getLongitude()));
                        marker.setMarker(getResources().getDrawable(getResources().getIdentifier(string, "drawable", getActivity().getPackageName())));
                                mMapView.addMarker(marker);

                        InfoWindow toolTip = marker.getToolTip(mMapView);
                        View view = toolTip.getView();
                        // view.setBackgroundResource(R.drawable.callout_button); THIS DOES NOT WORK
                        view.setOnTouchListener(new View.OnTouchListener() {
                            @Override
                            public boolean onTouch(View view, MotionEvent motionEvent) {
                                Log.e(TAG, "onTouch");

                                return true;
                            }
                        });
.

Это было полезно?

Решение

Отличный ответ Ryansh Требуется, что я включаю в себя TextViews с IDS Tooltip_Title и Tooltip_Description в пользовательской макете.Мне также пришлось добавить третью инструментов Tooltip_subdescription TextView.Код innovindow по умолчанию предполагает, что эти взгляды существуют и будут сражаться, если они этого не сделают.Для более контроля я протянул inwoWindow, переоцениваю onOpen и смог использовать любой макет, который я хотел для подсказки.Для переопределенного CreateTooltip в расширенном классе маркеров я естественным образом создал и вернул мой расширенный объект InsoWindow.

Обновление.Вот пример расширения маркера и нануждения для поддержки пользовательских всплывающих подсказков:

public class MapboxMarker extends Marker {
    private MyInfoWindow mInfoWindow;

    public class MyInfoWindow extends InfoWindow {

        public MyInfoWindow(int layoutResId, MapView mapView) {
            super(layoutResId, mapView);
        }

        public void onOpen(Marker overlayItem) {
            //
            //  Set data on mInfoWindow.getView()
            //
        }

    }

    public MapboxMarker(MapView mv, LatLng aLatLng, MapController mapController){
        super(mv, "Title", "Description", aLatLng);
    }

    @Override
    protected InfoWindow createTooltip(MapView mv) {
        mInfoWindow = new MyInfoWindow(R.layout.custom_tooltip_layout, mv);
        return mInfoWindow;
    }
}
.

Другие советы

Вам придется сами построить эту функцию, но на самом деле довольно легко выполнить, определяя пользовательский маркер и макет для подсказки.

Начните с определения макета всплывающей подсказки. Это должно быть релятивелаю, очевидно, для позиционирования изображения вызова. Установите свой контекст на любую деятельность, создавая маркеры. TipView внизу должен быть включен, потому что он контролирует размеры пользовательской всплывающей подсказки.

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:background="@color/white"
    android:id="@+id/parent_layout"
    android:padding="5dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    tools:context="com.XXX.MainActivity">

    <TextView
        android:id="@+id/tooltip_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/black"
        android:textSize="18sp"
        android:maxEms="17"
        android:layout_gravity="left"
        android:layout_weight="1"
        android:text="@string/toolTipTitle"/>

    <TextView
        android:id="@+id/tooltip_description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/black"
        android:textSize="14sp"
        android:maxEms="17"
        android:text="@string/toolTipDescription"
        android:layout_below="@+id/tooltip_title"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/marker_about"
        android:src="@drawable/ic_action_about"
        android:layout_toEndOf="@+id/tooltip_description"
        android:layout_toRightOf="@+id/tooltip_description"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:layout_marginLeft="10dp" />

    <com.mapbox.mapboxsdk.views.TipView
            android:layout_width="132dp"
            android:layout_height="10dp"/>
</RelativeLayout>
.

Затем создайте пользовательский класс маркера и переопределите метод CreateTooltip для возврата кнута с новой макетом:

public class CustomMarker extends Marker {

    public CustomMarker(MapView mv, String aTitle, String aDescription, LatLng aLatLng){
        super(mv, aTitle, aDescription, aLatLng);
    }

    @Override
    protected InfoWindow createTooltip(MapView mv) {
        return new InfoWindow(R.layout.custom_tooltip, mv);
    }
}
.

Это не должно меняться никакой другой функциональности, поэтому код, который у вас будет работать. Просто поменяйте маркер на пользовательское имя класса, и вы должны быть установлены.

Редактировать: вот код, который на самом деле устанавливает Custommarker и Innowindow с моей картой. Вы можете увидеть, что я запускаю еще одну активность на щелчке, и что я установил пользовательский значок для маркера, но этот материал не нужен:

        CustomMarker m =
                new CustomMarker(mv, report.issue, report.getFormattedDateString(), latLng);
        m.setIcon(new Icon(this, Icon.Size.LARGE, "oil-well", "FF0000"));
        //get the InfoWindow's view so that you can set a touch listener which will switch
        //to the marker's detailed view when clicked
        final InfoWindow infoWindow = m.getToolTip(mv);
        View view = infoWindow.getView();
        view.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                //make sure to choose action down or up, otherwise the intent will launch twice
                if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){
                    startActivity(intent);
                    //close the InfoWindow so it's not still open when coming back to the map
                    infoWindow.close();
                }
                return true;
            }
        });
        mv.addMarker(m);
.

Я также использую SDK 0.5.0-Snapshot. Я не уверен, будет ли это работать на более старых версиях SDK.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top