Imposta immagine callout Mapprox Android Android
Domanda
In iOS puoi facilmente impostare un callout per i marcatori chiamando:
[marker setCanShowCallout:YES];
[marker setRightCalloutAccessoryView:YOUR_BUTTON];
.
Ma non riesco a trovare questa funzionalità per Mapbox Android SDK.Ho un ascoltatore ora che rileva i tocchi sul calloutview ma come posso impostare un'immagine / pulsante 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;
}
});
. Soluzione
L'eccellente risposta di Ryansh ha richiesto di includere TextViews con IDS Tooltip_title e Tooltip_Description nel layout personalizzato.Ho anche dovuto aggiungere un terzo TEXT TEXTVisualizza TOXT TOUTTIP_SUBDESIGHT.Il codice di infowindow predefinito presuppone che queste opinioni esistono e si schiantano se non lo fanno.Per ulteriori controllo ho esteso Infowindow, sovradicamente Onopen ed è stato in grado di utilizzare qualsiasi layout che volevo per il tooltip.Per il createtooltip sovrascritto nella classe Marker estesa, ho naturalmente istanziati e restituito il mio oggetto Infowindow esteso.
Aggiornamento.Ecco un esempio di estensione del marker e dell'infowindow per supportare il suggerimento personalizzato:
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;
}
}
. Altri suggerimenti
Dovrai costruire questa funzionalità da solo, ma in realtà è piuttosto facile da realizzare definire un marker personalizzato e layout di strumenti.
Inizia definendo il tuo layout del tooltip. Deve essere un relativivellout ovviamente per posizionare l'immagine del callout. Imposta il tuo contesto in qualsiasi attività creando i marcatori. Il tipview in basso deve essere incluso, perché controlla il dimensionamento del suggerimento personalizzato.
<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>
.
Quindi creare una classe di marker personalizzata e sovrascrivere il metodo CreateTooltip per restituire un Infowindow con il nuovo layout:
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);
}
}
.
Questo non dovrebbe modificare altre funzionalità, quindi il codice che hai lavorato. Basta cambiare marker sul nome della classe personalizzato e dovresti essere impostato.
Modifica: Ecco il codice che imposta effettivamente il custommarker e Infowindow up con la mia mappa. Puoi vedere che sto lanciando un'altra attività sul clic e che ho impostato un'icona personalizzata per il marker, ma quella roba non è necessaria:
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);
.
Sto anche usando SDK 0.5.0-Snapshot. Non sono sicuro che questo funzioni su versioni precedenti dell'SDK.