更改应用程序语言(本地化)不会适用于API 23 Android



我在Android应用程序中面临某些问题。

当我在 API级别24 及更高版本上测试语言时,可以正常使用语言工作,但是当我更改模拟器上的语言 API级别23 时,它不会应用本地应用变化。我在许多论坛上读到了有关此信息的信息,但我尝试了几乎所有提供的解决方案,但它只是无法使用。

重要的是,关闭弹出菜单的动画(即列表列表(比在Android Nougat上关闭动画有点奇怪,因此它已经闻起来像某种不规则性了。

重要说明是我在API级别的23级或棉花糖的物理设备上运行应用程序,问题仍然存在。

在以下各节中,我提供了一些对于这种情况很重要的代码,另一方面,我省略了一些文件,例如 strings.xml and preceences.xml 对于这种情况,这不是必需的。因此,这里的主要重点是有可能改变应用程序语言。如果你们中的任何一个线索,我可能会要求他与我们分享的问题。


用于设置语言环境的助手类

package com.metropolitan.hangouter;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.Configuration;
import android.os.Build;
import java.util.Locale;
public class MyContextWrapper extends ContextWrapper {
public MyContextWrapper(Context base) {
    super(base);
}
@SuppressWarnings("deprecation")
public static ContextWrapper wrap(Context context, String language) {
    Configuration config = context.getResources().getConfiguration();
    Locale sysLocale = null;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        sysLocale = getSystemLocale(config);
    } else {
        sysLocale = getSystemLocaleLegacy(config);
    }
    if (!language.equals("") && !sysLocale.getLanguage().equals(language)) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            setSystemLocale(config, locale);
        } else {
            setSystemLocaleLegacy(config, locale);
        }
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        context = context.createConfigurationContext(config);
    } else {
        context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
    }
    return new MyContextWrapper(context);
}

@SuppressWarnings("deprecation")
public static Locale getSystemLocaleLegacy(Configuration config) {
    return config.locale;
}
@TargetApi(Build.VERSION_CODES.N)
public static Locale getSystemLocale(Configuration config) {
    return config.getLocales().get(0);
}
@SuppressWarnings("deprecation")
public static void setSystemLocaleLegacy(Configuration config, Locale locale) {
    config.locale = locale;
}
@TargetApi(Build.VERSION_CODES.N)
public static void setSystemLocale(Configuration config, Locale locale) {
    config.setLocale(locale);
}
}

然后,在我的主要活动中,我将其称为对我们至关重要的一种。

override fun attachBaseContext(newBase: Context) {
    preferences = PreferenceManager.getDefaultSharedPreferences(newBase)
    vred = preferences.getString("languageKey", "no selection")!!
    val locale = Locale(vred)
    super.attachBaseContext(MyContextWrapper.wrap(newBase, locale.language))
}

此方法在具有相同功能并将本地配置附加到basecontext的设置效果中调用,当然,由于所做的更改,我需要刷新活动,并且我正在处理该事件。

因此,此方法在正确的位置和正确的时间呼叫。换句话说,我每次都在启动活动。我的应用程序是用 kotlin 编写的,但是此myContextWrapper类位于 java 中。就是这样,如果有人需要更多信息,我将很高兴提供它。

这可能是由于以下内容而发生的:

从Android 7.0开始(API级别24(,Android提供了增强 支持多语言用户,允许他们选择多个 设置中的地点。Android通过大量提供此功能 扩大支持的地区的数量,并改变 系统解决资源。

您可以在此处阅读有关此信息的更多信息

如果您拥有名为XX_XX的资源,请尝试删除XX,这对我来说是在较旧版本上起作用的。否则指定完全合格的语言环境。

最新更新