package org.osmdroid.views.overlay.infowindow; import org.osmdroid.api.IMapView; import org.osmdroid.views.MapView; import org.osmdroid.views.overlay.Marker; import org.osmdroid.views.overlay.OverlayWithIW; import android.content.Context; import android.text.Html; import android.text.Spanned; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.TextView; /** * {@link org.osmdroid.views.overlay.infowindow.BasicInfoWindow} is the default * implementation of {@link org.osmdroid.views.overlay.infowindow.InfoWindow} for an * {@link org.osmdroid.views.overlay.OverlayWithIW}. * * It handles a title, a description and a sub-description. * Clicking on the bubble will close it. * * <img alt="Class diagram around Marker class" width="686" height="413" src='./doc-files/marker-infowindow-classes.png' /> * * @author M.Kergall * @see Marker */ public class BasicInfoWindow extends InfoWindow { /** * resource id value meaning "undefined resource id" */ public static final int UNDEFINED_RES_ID = 0; static int mTitleId=UNDEFINED_RES_ID, mDescriptionId=UNDEFINED_RES_ID, mSubDescriptionId=UNDEFINED_RES_ID, mImageId=UNDEFINED_RES_ID; //resource ids private static void setResIds(Context context){ String packageName = context.getPackageName(); //get application package name mTitleId = context.getResources().getIdentifier("id/bubble_title", null, packageName); mDescriptionId = context.getResources().getIdentifier("id/bubble_description", null, packageName); mSubDescriptionId = context.getResources().getIdentifier("id/bubble_subdescription", null, packageName); mImageId = context.getResources().getIdentifier("id/bubble_image", null, packageName); if (mTitleId == UNDEFINED_RES_ID || mDescriptionId == UNDEFINED_RES_ID || mSubDescriptionId == UNDEFINED_RES_ID || mImageId == UNDEFINED_RES_ID) { Log.e(IMapView.LOGTAG, "BasicInfoWindow: unable to get res ids in "+packageName); } } public BasicInfoWindow(int layoutResId, MapView mapView) { super(layoutResId, mapView); if (mTitleId == UNDEFINED_RES_ID) setResIds(mapView.getContext()); //default behavior: close it when clicking on the bubble: mView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent e) { if (e.getAction() == MotionEvent.ACTION_UP) close(); return true; } }); } @Override public void onOpen(Object item) { OverlayWithIW overlay = (OverlayWithIW)item; String title = overlay.getTitle(); if (title == null) title = ""; if (mView==null) { Log.w(IMapView.LOGTAG, "Error trapped, BasicInfoWindow.open, mView is null!"); return; } TextView temp=((TextView)mView.findViewById(mTitleId /*R.id.title*/)); if (temp!=null) temp.setText(title); String snippet = overlay.getSnippet(); if (snippet == null) snippet = ""; Spanned snippetHtml = Html.fromHtml(snippet); ((TextView)mView.findViewById(mDescriptionId /*R.id.description*/)).setText(snippetHtml); //handle sub-description, hidding or showing the text view: TextView subDescText = (TextView)mView.findViewById(mSubDescriptionId); String subDesc = overlay.getSubDescription(); if (subDesc != null && !("".equals(subDesc))){ subDescText.setText(Html.fromHtml(subDesc)); subDescText.setVisibility(View.VISIBLE); } else { subDescText.setVisibility(View.GONE); } } @Override public void onClose() { //by default, do nothing } }