【问题标题】:Google Maps v2 change language谷歌地图 v2 更改语言
【发布时间】:2016-05-10 07:59:56
【问题描述】:

问题是谷歌地图保留了它首次打开时的语言。例如,我有 2 个活动(活动 A 和活动 B)。活动 A 包含设置页面,我在其中将语言更改为该活动。请注意,它不是系统语言,而是使用Locale.setDefault()。这成功地翻译了我的应用程序,文本没有问题,除了谷歌地图语言。 Activity B 由我在其中显示地图的 MapFragment 组成。

当我以 English 语言启动 MapActivity 时,地图显示 English 语言。当我回到 Activity A 并更改语言,然后再次打开 MapActivity 时,地图会保留英语语言,就像从后台进程中保存其实例一样。

我的调查是,谷歌地图语言基于地图呈现的第一种语言,除非应用程序完全关闭,否则它将保留。

有人可以帮我解决这个问题,根据我的设置页面中设置的语言环境更改谷歌地图语言。到目前为止我尝试的是清除缓存(我的应用程序和谷歌服务)并通过激活SupportMapFragmentuseViewLifeCycleInFragments 并使用片段生命周期来销毁片段。

谢谢。

更新

仍然无法翻译谷歌地图:

我尝试过的:

  1. 关闭 google play 服务进程 -> 不工作(不可能)

  2. 使用 2 个地图片段 -> 不工作,它将加载相同的地图

【问题讨论】:

  • 如果您在开发者选项中激活“不保留活动”,行为会改变吗?
  • 您是否也在使用 getBaseContext().getResources().updateConfiguration 进行更改?如果您在参加活动 B 之前更改语言会发生什么?
  • @pablobu 在我的语言环境助手中是的
  • @SecretCoder 你找到解决方案了吗?我有一个类似的问题。我不想如下所述覆盖图块。
  • @Hollywood 到目前为止没有解决方案,只是很幸运客户认为它是这样的:D

标签: android google-maps google-maps-android-api-2


【解决方案1】:

问题是谷歌地图的瓷砖缓存。 你应该做的是使用Tile OverlaysTile Provider

Google 在我提供的链接中为您提供了一些示例。

您应该自己获取图块并使用 imageloader 或 picaso 库,然后在它们的设置中禁用缓存。

通过这样做,您总能获得您提供的本地语言的新图块

示例:

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.TileOverlay;
import com.google.android.gms.maps.model.TileOverlayOptions;
import com.google.android.gms.maps.model.TileProvider;
import com.google.android.gms.maps.model.UrlTileProvider;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.CheckBox;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Locale;

/**
 * This demonstrates how to add a tile overlay to a map.
 */
public class TileOverlayDemoActivity extends AppCompatActivity implements OnMapReadyCallback {

/** This returns moon tiles. */
private static final String MOON_MAP_URL_FORMAT =
        "http://mw1.google.com/mw-planetary/lunar/lunarmaps_v1/clem_bw/%d/%d/%d.jpg";

private TileOverlay mMoonTiles;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tile_overlay_demo);

    SupportMapFragment mapFragment =
            (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap map) {
    map.setMapType(GoogleMap.MAP_TYPE_NONE);

    TileProvider tileProvider = new UrlTileProvider(256, 256) {
        @Override
        public synchronized URL getTileUrl(int x, int y, int zoom) {
            // The moon tile coordinate system is reversed.  This is not normal.
            int reversedY = (1 << zoom) - y - 1;
            String s = String.format(Locale.US, MOON_MAP_URL_FORMAT, zoom, x, reversedY);
            URL url = null;
            try {
                url = new URL(s);
            } catch (MalformedURLException e) {
                throw new AssertionError(e);
            }
            return url;
        }
    };

    mMoonTiles = map.addTileOverlay(new TileOverlayOptions().tileProvider(tileProvider));
}

public void setFadeIn(View v) {
    if (mMoonTiles == null) {
        return;
    }
    mMoonTiles.setFadeIn(((CheckBox) v).isChecked());
}
}

您应该做的是在 Tile Provider 中更改 OnMapReady 中的 Local

【讨论】:

  • 但图块叠加只是图像,实际上并不是我可以在其中放置多边形的地图吗?
  • 没有兄弟!它在世界各地都有效。您应该做的是找到 url 并将其替换为 URL。喜欢这个'mt1.google.com/vt/lyrs=y&x=1325&y=3143&z=13'@SecretCoder
  • 但是 db 只返回 lat 和 long,我不能使用 web api
【解决方案2】:

首先,您必须了解支持的语言并注意Locale 中详述的语言代码。

要以编程方式进行,此 SO 帖子中已经给出了解决方案 - How to change language in android google maps v2 programmatically

如果它也适合您,请告诉我们。 :)

【讨论】:

  • 我已经意识到了这一点,也知道了那个 SO 帖子。这是正确的,它改变了语言环境,但只改变了一次。当您返回并更改区域设置并再次打开地图活动时,语言仍然是因为地图实例未重置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
相关资源
最近更新 更多