Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改应用程序语言(本地化)不适用于api 23 android_Android_Kotlin_Localization_Locale_Android 6.0 Marshmallow - Fatal编程技术网

更改应用程序语言(本地化)不适用于api 23 android

更改应用程序语言(本地化)不适用于api 23 android,android,kotlin,localization,locale,android-6.0-marshmallow,Android,Kotlin,Localization,Locale,Android 6.0 Marshmallow,我在android应用程序中面临一些本地化问题 当我在api级别24及更高版本上测试时,用于更改语言的函数正常工作,但当我在emulatorapi级别23上更改语言时,它不会应用本地更改。我在很多论坛上都读到过这方面的文章,我尝试过几乎所有提供的解决方案,但都不起作用 重要的是,关闭弹出菜单的动画,即listPreference,比关闭Android Nougat上的动画稍微奇怪,所以它已经闻起来有点不规则了 重要注意事项是我在物理设备上运行应用程序,该设备是api级别23或棉花糖,问题仍然存在

我在android应用程序中面临一些本地化问题

当我在api级别24及更高版本上测试时,用于更改语言的函数正常工作,但当我在emulatorapi级别23上更改语言时,它不会应用本地更改。我在很多论坛上都读到过这方面的文章,我尝试过几乎所有提供的解决方案,但都不起作用

重要的是,关闭弹出菜单的动画,即listPreference,比关闭Android Nougat上的动画稍微奇怪,所以它已经闻起来有点不规则了

重要注意事项是我在物理设备上运行应用程序,该设备是api级别23或棉花糖,问题仍然存在

在下面的部分中,我提供了一些对本例非常重要的代码,另一方面,我省略了一些文件,如strings.xmlpreferences.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))
}
此方法也在SettingsActivity中调用,它具有相同的功能,并将本地配置附加到baseContext,当然,由于已进行了更改,我需要刷新活动,我正在处理该事件


所以这个方法在正确的时间和地点调用。换言之,每次偏好改变时,我都在刷新活动。我的应用程序是用kotlin编写的,但是这个MyContextWrapper类是用java编写的。现在就到此为止,如果有人需要更多的信息,我很乐意提供

这可能是因为以下原因:

从Android 7.0(API级别24)开始,Android提供了增强的 支持多语言用户,允许他们选择多个 设置中的区域设置。安卓系统提供这一功能的方式非常简单 扩展支持的区域设置的数量并更改 系统解析资源

你可以阅读更多关于这方面的内容


如果您的资源名为xx_xx,请尝试删除xx,这在旧版本上对我有效。否则,请指定完全限定的区域设置。

我尝试将strings.xml资源重命名为不带国家/地区标记(大写缩写)的名称,并且在模拟器上以及物理设备上也可以使用。唯一的缺点是重命名过程必须通过项目视图层次结构手动完成。不管怎样,谢谢你的建议,因为现在它终于起作用了。