在 Android 中始终显示地图标记标题

问题描述 投票:0回答:7

我通过以下方式将默认标记添加到 GoogleMap:

GoogleMap map = ((MapFragment) getFragmentManager().findFragmentById(R.id.editMapMap)).getMap();

MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(currentLocation.getCoordinate());
markerOptions.title(Utils.getLocationString(currentLocation.getCoordinate()));
markerOptions.snippet("Blah");

locationMarker = map.addMarker(markerOptions);
locationMarker.setDraggable(true);

如何使标记始终显示标题和片段而不触摸?我还想禁用在触摸时隐藏它们。

java android google-maps
7个回答
105
投票

非常简单:

locationMarker.showInfoWindow();

7
投票

使用

showInfoWindow()
并添加如下标记。

Marker marker = mMap.addMarker(new MarkerOptions().position(currentPosition).title("Your text"));
marker.showInfoWindow();

5
投票

只需为

onMarkerClickListener
返回 false,如果返回 true 则显示
infoWindow

单击标记时隐藏标题:

map.setOnMarkerClickListener(this);
...

@Override
public boolean onMarkerClick(Marker arg0) {     
  Log.i(TAG,"marker arg0 = "+arg0);               
  return false;
}

如果我们返回 true 标题将被显示,否则如果我们返回 false 标题将不会显示。


5
投票

有两种显示和隐藏标记的方法。布尔返回值只是阻止默认行为发生 (false) 或允许它发生 (true)。换句话说,它通知系统您是否消费了该事件。请参阅 Google API 参考

private GoogleMap.OnMarkerClickListener onMarkerClickedListener = new GoogleMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        if (marker.isInfoWindowShown()) {
            marker.hideInfoWindow();
        } else {
            marker.showInfoWindow();
        }
        return true;
    }
};

mGoogleMap.setOnMarkerClickListener(onMarkerClickedListener);

3
投票

我知道这个问题很旧,但我会在这里发布我的答案,以防它对某人有帮助。

信息窗口不适用于我的情况,我希望标题仅在有空间时才显示,如果没有足够的空间显示,则可能会隐藏标题,以便它们不会彼此重叠。

我在互联网上找不到解决方案,所以我卷起袖子制作了这个库来解决我的问题,希望它也能帮助其他人:

https://github.com/androidseb/android-google-maps-floating-marker-titles

以下是其工作原理的预览:


1
投票

等等,但这是我的答案:

从文档中,有一段文字说信息窗口一次显示一个,所以没有办法做到这一点:

“信息窗口允许您在用户访问时向他们显示信息 点击标记。 一次仅显示一个信息窗口。如果一个 用户单击标记,当前信息窗口将关闭并且 将显示新的信息窗口。请注意,如果用户点击 当前显示信息窗口的标记,该信息窗口 关闭并重新打开。”

Maps api 文档说:

“最佳实践:为了获得最佳用户体验,地图上任何时候只应打开一个信息窗口。多个信息窗口会使地图显得混乱。如果一次只需要一个信息窗口,则可以只创建一个信息窗口一个

InfoWindow
对象,并在地图事件(例如用户点击)时在不同位置或标记处打开它。如果您确实需要多个信息窗口,您可以同时显示多个
InfoWindow
对象。”

https://developers.google.com/maps/documentation/javascript/infowindows


0
投票

使用覆盖或自定义标记 您可以创建自定义标记,将标题直接包含在标记布局中,而不是依赖默认信息窗口,从而确保标题始终可见:

创建自定义标记布局: 设计包含标题的自定义标记布局。 以编程方式创建标记: 为每个标记使用自定义布局。 以下是如何实现这一点的示例:

第 1 步:创建自定义标记布局 在 res/layout 文件夹中创建自定义布局 XML 文件 custom_marker.xml:

xml 复制代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:gravity="center">

    <TextView
        android:id="@+id/marker_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:background="@drawable/marker_background"
        android:textColor="@android:color/black"/>

    <ImageView
        android:id="@+id/marker_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_marker"/>
</LinearLayout>

您可以使用简单的可绘制背景作为标题(res/drawable 文件夹中的marker_background.xml):

xml 复制代码

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@android:color/white"/>
    <corners android:radius="5dp"/>
    <stroke android:width="1dp" 
    android:color="@android:color/darker_gray"/>
</shape>

第 2 步:创建自定义标记并将其添加到地图 在您的活动中,以编程方式创建自定义标记并将其添加到地图中:

java 复制代码

private Bitmap createCustomMarker(Context context, String title) {
    View markerView = LayoutInflater.from(context).inflate(R.layout.custom_marker, null);
    TextView titleView = markerView.findViewById(R.id.marker_title);
    titleView.setText(title);

    markerView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
    markerView.layout(0, 0, markerView.getMeasuredWidth(), markerView.getMeasuredHeight());

    Bitmap bitmap = Bitmap.createBitmap(markerView.getMeasuredWidth(), markerView.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    markerView.draw(canvas);

    return bitmap;
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    // Adding markers with custom titles
    LatLng room230_1stFloor = new LatLng(34.052235, -118.243683); // example coordinates
    Marker room230_1stFloorMarker = mMap.addMarker(new MarkerOptions()
            .position(room230_1stFloor)
            .icon(BitmapDescriptorFactory.fromBitmap(createCustomMarker(this, "Room 230"))));
    
    LatLng room4822_1stFloor = new LatLng(34.052235, -118.243683); // example coordinates
    Marker room4822_1stFloorMarker = mMap.addMarker(new MarkerOptions()
            .position(room4822_1stFloor)
            .icon(BitmapDescriptorFactory.fromBitmap(createCustomMarker(this, "Room 4822"))));
}

在此方法中,每个标记都将具有自定义布局,标题直接显示在图标下方。

© www.soinside.com 2019 - 2024. All rights reserved.