谷歌地图Android API v2,标记标题/片段显示错误

7
我使用Google Maps Android API v2和Android一起显示当前位置与附近标记。使用Google Places API接收附近地点的位置和标题。问题在于,标题/摘要中的非英语名称以错误的方式显示,例如希伯来语名称。附上了屏幕截图。

可能是因为Maps V2没有正确的RTL支持。您是否遇到了与LTR语言有关的问题? - CommonsWare
再次强调,我的理论并不是关于国际化(i18n)的一般性问题,而是关于从右到左(RTL)和从左到右(LTR)语言的问题。在Android中,适当的RTL支持相对较新,并且Maps V2可能会出现问题。您可以使用“InfoWindowAdapter”创建自己的地图气球内容,在其中比内置的RTL更好地完成工作。 - CommonsWare
也许你是对的。我也认为这是RTL问题。但是请听我说,我没有合适的数据位置来检查所有语言或大多数语言... 尽管英语、俄语看起来不错。阿拉伯语、希伯来语则不然。所有事情都与RTL相反,对吧。 - Oleg Karakoz
那肯定感觉像是RTL问题。 - CommonsWare
嗨,Oleg,我也在使用Google Maps Android API v2来显示谷歌地图。我正在尝试使用Places API,但是当我发送请求时,它返回了Access_denied。我的问题是,如果您使用相同的Google Maps Android API v2密钥向Google Places发出请求,例如https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=%f,fd&radius=500&types=food&name=harbour&sensor=true/false&key=<my key>。谢谢, 吉尔 - gilush14
显示剩余2条评论
3个回答

13

由于阿拉伯语和希伯来语存在问题,而英语和俄语则没有问题,我猜测默认信息窗口实现可能存在与从右到左 (RTL) 语言相关的问题。特别是如果您在 Android 4.2 上运行测试,则可能是 Maps V2 的默认信息窗口内容错误地应用了各种 RTL 相关属性。

幸运的是,您可以提供自己的信息窗口内容,方法是实现 InfoWindowAdapter 并使 getInfoContents() 返回您想要在信息窗口中使用的 View

例如,这个示例项目(来自我的书的明天的更新)展示了如何使用此 InfoWindowAdapter 自定义信息窗口:

class PopupAdapter implements InfoWindowAdapter {
  LayoutInflater inflater=null;

  PopupAdapter(LayoutInflater inflater) {
    this.inflater=inflater;
  }

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

  @Override
  public View getInfoContents(Marker marker) {
    View popup=inflater.inflate(R.layout.popup, null);

    TextView tv=(TextView)popup.findViewById(R.id.title);

    tv.setText(marker.getTitle());
    tv=(TextView)popup.findViewById(R.id.snippet);
    tv.setText(marker.getSnippet());

    return(popup);
  }
}

如果您想要替换整个窗口,您需要让getInfoWindow()返回一个View。如果getInfoWindow()返回null,那么会使用getInfoContents()来获取窗口内容。然后,您可以通过在GoogleMap上调用setInfoWindowAdapter()来附加一个InfoWindowAdapter实例。

在您的情况下,您可以使用自己的布局来确保正确地实现RTL。这应该原则上可以解决此问题。可能 Maps V2 会做一些奇怪的事情,导致正常工作的RTL代码出现问题,这种情况下,您需要提交一个问题


1
我只想补充一下,在我的情况下,我应该这样做: @Override public View getInfoContents(Marker marker) { TextView info = new TextView(ShareLocation.this); info.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); info.setText(marker.getTitle() + "\n" + marker.getSnippet()); info.setTextColor(ShareLocation.this.getResources().getColor(R.color.black));return info; }运行得很好。而主要的秘密是为什么谷歌错过了这种方式 :-) - Oleg Karakoz
@OlegPreobrazhenskyy,你能让希伯来语正常工作吗?我正在使用GetInfoWindow尝试自己的布局,虽然英文看起来还好,但TextView中的希伯来语根本看不到...任何帮助将不胜感激。 - Shushu
@CommonsWare 有没有一种方法可以设置UTF8字符串?(阿拉伯语) - S.M_Emamian
据我所知,TextView 支持阿拉伯语字符串。如果您遇到问题,请发布一个全新的 Stack Overflow 问题,展示您的代码以及可能出现的任何问题的截图。 - CommonsWare
@CommonsWare 对于希伯来语,这个方法不起作用。为了让它起作用,我不得不为每个textView添加 android:textDirection="locale"。但我不知道它在API 17之前的版本上是否正常工作。 - android developer
根据报告的错误:https://issuetracker.google.com/issues/35823358,看起来谷歌已经解决了这个问题。 - xomena

2
“添加有关CommnsWare答案的更多信息:
截至我撰写此评论时,似乎地图本身是layout_direction="LTR",这意味着您的标题不会在RTL桌面上翻转。解决方案很简单:”
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layoutDirection="locale"
>
    ....
</RelativeLayout>

请注意,我正在使用本地布局方向而不是继承的方向。我在相应的Google错误报告上发表了评论,链接在这里:https://code.google.com/p/gmaps-api-issues/issues/detail?id=5608#makechanges

“layoutDirection”自API 17起可用。在此之前会发生什么?另外,我认为它仅在为textViews设置textDirection时才起作用。 - android developer
这个问题似乎没有得到解决,即使现在已经是2020年了。对我有效的唯一方法就是这个评论。 - DeanK

0
我注意到这个 bug 只会在 LinearLayout 上出现(非常奇怪)。
尝试使用 RelativeLayout,或者如果您的 API 版本在 17 及以上,则为每个 TextView 设置 textDirection,应该就可以解决问题了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接