以编程方式设置Locale All Over App With API 27

时间:2018-03-05 11:35:36

标签: android

我正在使用此应用程序类在我的应用程序中设置我的语言环境

public class MyApplication extends Application {
public static void updateLanguage(Context ctx) {
    SharedPreferences prefs = getDefaultSharedPreferences(ctx);
    String lang = prefs.getString("locale_override", "");
    updateLanguage(ctx, lang);

}

public static void updatefont(Context ctx) {
    SharedPreferences prefs = getDefaultSharedPreferences(ctx);

    String lang = prefs.getString("locale_override", "");
    if (lang.equals("ar")) {
        CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                .setDefaultFontPath("fonts/Cairo-Regular.ttf")
                .setFontAttrId(R.attr.fontPath)
                .build()
        );

    } else {
    }


}

public static void updateLanguage(Context ctx, String lang) {
    Configuration cfg = new Configuration();
    if (!TextUtils.isEmpty(lang))
        cfg.locale = new Locale(lang);
    else
        cfg.locale = Locale.getDefault();

    ctx.getResources().updateConfiguration(cfg, null);
}

@Override
public void onCreate() {
    updateLanguage(this);
    updatefont(this);
    super.onCreate();


}
}

它的工作正常但是当我在 Nexus 5X API 27 仿真器设备上进行测试时,它根本不起作用。所有解决方案都不起作用

1 个答案:

答案 0 :(得分:0)

通过考虑这种方式,您将字体设置为 app (不是一个好方法),您应该this代替。

此外,您应该知道使用已弃用的方法来更改本地化,您还需要设置 DisplayMetrics ,如: DisplayMetrics dm = res.getDisplayMetrics();

设置语言后,最好为用户重启应用程序(更好的体验)。

整个方法应该是:

 @SuppressWarnings("deprecation")
public static void updateLanguage(Context ctx, String lang) {
Locale locale = new Locale(lang);
Resources resources = ctx.getResources();
Configuration configuration = resources.getConfiguration();
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
    configuration.setLocale(locale);
} else{
    configuration.locale=locale;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
    getApplicationContext().createConfigurationContext(configuration);
} else {
    resources.updateConfiguration(configuration,displayMetrics);
}


    Intent i = getBaseContext().getPackageManager()
            .getLaunchIntentForPackage(getBaseContext().getPackageName());
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(i);
    this.finish();

}