Android:以编程方式设置区域设置会导致谷歌地图从错误的可绘制区域设置

时间:2017-05-31 12:16:44

标签: android google-maps localization

我试图通过用户按钮来改变语言环境,所以我写了这个包装类来在我所有活动继承的baseActivity中进行,如下所示:

ContextWrapper.java

public class ContextWrapper extends android.content.ContextWrapper {

    public ContextWrapper(Context base) {
        super(base);
    }

    public static ContextWrapper wrap(Context context, Locale newLocale) {

        Resources res = context.getResources();
        Configuration configuration = res.getConfiguration();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            configuration.setLocale(newLocale);

            LocaleList localeList = new LocaleList(newLocale);
            LocaleList.setDefault(localeList);
            configuration.setLocales(localeList);

            context = context.createConfigurationContext(configuration);

        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLocale(newLocale);
            context = context.createConfigurationContext(configuration);

        } else {
            configuration.locale = newLocale;
            res.updateConfiguration(configuration, res.getDisplayMetrics());
        }

        return new ContextWrapper(context);
    }
}

我在BaseActivity类中使用它,如下所示:

    @Override
    protected void attachBaseContext(Context newBase) {
        sharedpreferences = PreferenceManager.getDefaultSharedPreferences(newBase);
        //getLang() is some method that loads a language tag like "en" or "fr" from sharedpreferences 
        String languageToLoad  = getLang(); // your language
        Locale locale = new Locale(languageToLoad);

        Context context = ContextWrapper.wrap(newBase, locale);
        super.attachBaseContext(context);

    }

我重新创建活动以使更改生效,应用程序将使用以下方式加载新资源:         重新创建();

一切正常,所有其他资源从正确的语言环境加载到我在我的活动中谷歌地图的这一行(即使谷歌地图语言是正确的!):

        private Marker destinationMarker = mMap.addMarker(new MarkerOptions()
            .position(dstLatLng)
            .icon(BitmapDescriptorFactory.fromResource(R.drawable.dest_set)));

我的所有本地化资源中都有相同名称dest_set的资源文件(特定的抽奖)

问题是当我从任何选择的语言设置标记时,它将仅使用没有本地化的抽象(如drawable-hdpi,...),我放置" en"文件默认情况下,我的代码有什么问题?

1 个答案:

答案 0 :(得分:1)

  

我可以确认它确实有效,但结果很糟糕!

这部分并不让我感到惊讶,不过可能通过一些实验你可以找到一个有效的位图。

正如我在评论中提到的,我的猜测是BitmapDescriptorFactory.fromResource()无法解码您流程中的资源。它解码Play服务中的资源。处理。您已在流程中更改了区域设置,但这不会影响Play服务,因此它会使用设备的标准区域设置加载资源。

  

还有其他方法吗?

关闭袖口,您的选择是:

  1. 使用fromBitmap()找到一些有效的方法,或者在您的流程中完成资源解码步骤,这样您的流程就可以了。区域设置(不是Play Services')是使用的区域。

  2. 使用除fromBitmap()fromResource()之外的其他内容来控制位图内容。例如,您可以将这些图片放在assets/中,其中的路径与其区域设置相关联,然后尝试fromAsset()

  3. 停止使用区域设置更改功能。

  4. 停止使用地图标记功能。