Android 无法使用createConfigurationContext()更改应用程序的语言

Android 无法使用createConfigurationContext()更改应用程序的语言,android,Android,我正在尝试使用以下代码在运行时更改我的应用程序的语言 private static Context updateResources(Context context, String language) { Locale locale = new Locale(language); Locale.setDefault(locale); Resources res = context.getResources(); Configuration config = new

我正在尝试使用以下代码在运行时更改我的应用程序的语言

private static Context updateResources(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Resources res = context.getResources();
    Configuration config = new Configuration(res.getConfiguration());
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
        config.setLocale(locale);
        LocaleList.setDefault(new LocaleList(locale));

        context = context.createConfigurationContext(config);
    }
    else if (Build.VERSION.SDK_INT >= 17) {
        config.setLocale(locale);
        context = context.createConfigurationContext(config);
    } else {
        config.locale = locale;
        res.updateConfiguration(config, res.getDisplayMetrics());
    }
    return context;
}
然后我覆盖
应用程序
活动
attachBaseContext()

奇怪的是,当我在一个单独的项目上执行这些步骤时,语言会发生变化,但我的应用程序上的情况似乎无能为力

我已经记录了活动的上下文对象上的区域设置是否发生了更改,并且似乎更改正确,但在获取字符串资源时,仍然无法正确选择

任何帮助都将不胜感激

编辑


原来问题是我在build.gradle中有一行“resconfig“en”,这阻止了语言更改。

选择Langauge活动

private LinearLayout llHindi, llEnglish;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_change_language);
    resetTitles();
    llHindi = (LinearLayout) findViewById(R.id.llHindi);
    llEnglish = (LinearLayout) findViewById(R.id.llEnglish);


    llHindi.setOnClickListener(this);
    llEnglish.setOnClickListener(this);
}



private boolean setNewLocale(String language, boolean restartProcess) {
    LocaleManager.setNewLocale(this, language);

    Intent i = new Intent(this, MainActivity.class);
    startActivity(i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK));

    if (restartProcess) {
        System.exit(0);
    } else {
    }
    return true;
}



@Override
public void onClick(View v) {
    int id = v.getId();

    if (id == R.id.llEnglish) {
        setNewLocale(LANGUAGE_ENGLISH, true);
    }

    if (id == R.id.llHindi) {
        setNewLocale(LANGUAGE_HINDI, true);
    }
}



@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(LocaleManager.setLocale(base));
}



private void resetTitles() {
    try {
        ActivityInfo info = getPackageManager().getActivityInfo(getComponentName(), GET_META_DATA);
        if (info.labelRes != 0) {
            setTitle(info.labelRes);
        }
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
}
本地管理员

public class LocaleManager {

public static final  String LANGUAGE_ENGLISH   = "en";
public static final  String LANGUAGE_HINDI = "hi";
private static final String LANGUAGE_KEY       = "language_key";

public static Context setLocale(Context c) {
    return updateResources(c, getLanguage(c));
}

public static Context setNewLocale(Context c, String language) {
    persistLanguage(c, language);
    return updateResources(c, language);
}

public static String getLanguage(Context c) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c);
    return prefs.getString(LANGUAGE_KEY, LANGUAGE_ENGLISH);
}

@SuppressLint("ApplySharedPref")
private static void persistLanguage(Context c, String language) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c);
    // use commit() instead of apply(), because sometimes we kill the application process immediately
    // which will prevent apply() to finish
    prefs.edit().putString(LANGUAGE_KEY, language).commit();
}

private static Context updateResources(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Resources res = context.getResources();
    Configuration config = new Configuration(res.getConfiguration());
    if (Build.VERSION.SDK_INT >= 17) {
        config.setLocale(locale);
        context = context.createConfigurationContext(config);
    } else {
        config.locale = locale;
        res.updateConfiguration(config, res.getDisplayMetrics());
    }
    return context;
}

public static Locale getLocale(Resources res) {
    Configuration config = res.getConfiguration();
    return Build.VERSION.SDK_INT >= 24 ? config.getLocales().get(0) : config.locale;
}
全局类扩展应用程序

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(LocaleManager.setLocale(base));
    //Log.d(TAG, "attachBaseContext");
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    LocaleManager.setLocale(this);
    //Log.d(TAG, "onConfigurationChanged: " + newConfig.locale.getLanguage());
}

这将起作用,您需要为不同的语言创建不同的string.xml文件

为您的活动创建基类,然后将语言存储在共享首选项中,并加载到语言存储值和创建活动时使用值加载该语言。!你好,Helo,你找到解决办法了吗?
@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(LocaleManager.setLocale(base));
    //Log.d(TAG, "attachBaseContext");
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    LocaleManager.setLocale(this);
    //Log.d(TAG, "onConfigurationChanged: " + newConfig.locale.getLanguage());
}