Android Google Maps v2: 如何用多行代码片段添加标记?

有人知道如何将多行代码片段添加到谷歌地图标记吗? 这是我添加标记的代码:

map.getMap().addMarker(new MarkerOptions()
.position(latLng()).snippet(snippetText)
.title(header).icon(icon));

我想要这样的片段:

| HEADER |
|foo     |
|bar     |

但是当我试图将 nippetText 设置为“ foo n bar”时,我看到的只是 foo bar,而且我不知道如何将其设置为多行。你能帮我吗?

78571 次浏览

看起来你需要创建自己的“信息窗口”内容来实现这一点:

  1. 创建一个覆盖 getInfoContents()InfoWindowAdapter实现,以返回您想要进入 InfoWindow帧的内容

  2. GoogleMap上调用 setInfoWindowAdapter(),传递 InfoWindowAdapter的一个实例

这个示例项目 演示了该技术。用 "foo\nbar"正确地替换代码段将处理换行符。但是,更可能的情况是,您只需要提供一个布局,避免使用换行符,并为所需的可视化结果中的每一行提供单独的 TextView小部件。

我已经用下面这些简单的方法做到了:

private GoogleMap mMap;

增加 记号笔谷歌地图:

LatLng mLatLng = new LatLng(YourLatitude, YourLongitude);


mMap.addMarker(new MarkerOptions().position(mLatLng).title("My Title").snippet("My Snippet"+"\n"+"1st Line Text"+"\n"+"2nd Line Text"+"\n"+"3rd Line Text").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));

之后,在 谷歌地图上输入以下 资讯窗口 适配器的代码:

mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {


@Override
public View getInfoWindow(Marker arg0) {
return null;
}


@Override
public View getInfoContents(Marker marker) {


LinearLayout info = new LinearLayout(mContext);
info.setOrientation(LinearLayout.VERTICAL);


TextView title = new TextView(mContext);
title.setTextColor(Color.BLACK);
title.setGravity(Gravity.CENTER);
title.setTypeface(null, Typeface.BOLD);
title.setText(marker.getTitle());


TextView snippet = new TextView(mContext);
snippet.setTextColor(Color.GRAY);
snippet.setText(marker.getSnippet());


info.addView(title);
info.addView(snippet);


return info;
}
});

希望对你有帮助。

正如安德鲁• S (Andrew S)所建议的那样,以 海伦 · 帕特尔的回答为基础:

 mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {


@Override
public View getInfoWindow(Marker arg0) {
return null;
}


@Override
public View getInfoContents(Marker marker) {


Context context = getApplicationContext(); //or getActivity(), YourActivity.this, etc.


LinearLayout info = new LinearLayout(context);
info.setOrientation(LinearLayout.VERTICAL);


TextView title = new TextView(context);
title.setTextColor(Color.BLACK);
title.setGravity(Gravity.CENTER);
title.setTypeface(null, Typeface.BOLD);
title.setText(marker.getTitle());


TextView snippet = new TextView(context);
snippet.setTextColor(Color.GRAY);
snippet.setText(marker.getSnippet());


info.addView(title);
info.addView(snippet);


return info;
}
});

SetOnMapClickListener (新的 GoogleMap.OnMapClickListener ()){

        @Override
public void onMapClick(LatLng point) {


// Already two locations
if (markerPoints.size() > 1) {
markerPoints.clear();
mMap.clear();
}


// Adding new item to the ArrayList
markerPoints.add(point);


// Creating MarkerOptions
MarkerOptions options = new MarkerOptions();


// Setting the position of the marker


options.position(point);
if (markerPoints.size() == 1) {
options.icon(BitmapDescriptorFactory.fromResource(R.mipmap.markerss)).title("Qtrip").snippet("Balance:\nEta:\nName:");
options.getInfoWindowAnchorV();
} else if (markerPoints.size() == 2) {
options.icon(BitmapDescriptorFactory.fromResource(R.mipmap.markerss)).title("Qtrip").snippet("End");
}
mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {


@Override
public View getInfoWindow(Marker arg0) {
return null;
}


@Override
public View getInfoContents(Marker marker) {


Context context = getApplicationContext(); //or getActivity(), YourActivity.this, etc.


LinearLayout info = new LinearLayout(context);
info.setOrientation(LinearLayout.VERTICAL);


TextView title = new TextView(context);
title.setTextColor(Color.BLACK);
title.setGravity(Gravity.CENTER);
title.setTypeface(null, Typeface.BOLD);
title.setText(marker.getTitle());


TextView snippet = new TextView(context);
snippet.setTextColor(Color.GRAY);
snippet.setText(marker.getSnippet());


info.addView(title);
info.addView(snippet);


return info;
}
});
mMap.addMarker(options);

基于 海伦 · 帕特尔解决方案。此代码从布局创建 TextView,而不是从零创建。一个显著的区别是: 如果有 集群,那么在集群中单击时不会看到 无效标签

override fun onMapReady(googleMap: GoogleMap) {
this.googleMap = googleMap
...


// Use this anonymous class or implement GoogleMap.InfoWindowAdapter.
googleMap.setInfoWindowAdapter(object : GoogleMap.InfoWindowAdapter {
override fun getInfoContents(marker: Marker): View? {
return null
}


override fun getInfoWindow(marker: Marker): View? =
if (marker.title == null)
null
else {
val inflater = LayoutInflater.from(context)
val view = inflater.inflate(R.layout.layout_marker, null, false)
view.label.text = marker.title
    

view
}
})

Layout _ marker. xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:textColor="$f0f0f0"
android:textSize="12sp"
tools:text="Marker"
android:background="#00aaee"
/>

同样的代码,但是在 Kotlin:

    mMap?.setInfoWindowAdapter(object : InfoWindowAdapter {
override fun getInfoWindow(arg0: Marker): View? {
return null
}
        

override fun getInfoContents(marker: Marker): View {
val info = LinearLayout(applicationContext)
info.orientation = LinearLayout.VERTICAL
val title = TextView(applicationContext)
title.setTextColor(Color.BLACK)
title.gravity = Gravity.CENTER
title.setTypeface(null, Typeface.BOLD)
title.text = marker.title
val snippet = TextView(applicationContext)
snippet.setTextColor(Color.GRAY)
snippet.text = marker.snippet
info.addView(title)
info.addView(snippet)
return info
}
})