我想以编程方式更改我的应用语言。我有一些适用于旧手机(Android 6)的代码,但不适用于Android 8和Android9。任何适用于应用语言更改的解决方案?调用setLocal之后,我在Activity中调用recreate()。字符串仍然没有变化。
在我的MainActivity
(在BaseActivity
中扩展onCreate()
的情况下,如果我呼叫Locale.getDefault().language
,则返回正确的语言代码,但字符串仍为英语,默认为{{1 }}。
string.xml
更新:
Ive在下面使用了两种解决方案的组合,但仍然没有成功。我开设了fun setLocale(context: Context, language: String?): Context {
app.setLanguage(language)
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
updateResources(context, language)
} else updateResourcesLegacy(
context,
language
)
}
@TargetApi(Build.VERSION_CODES.N)
private fun updateResources(context: Context, language: String?): Context {
val locale =
if (language == null){
Locale(Locale.getDefault().language)
} else {
Locale(language)
}
Locale.setDefault(locale)
val configuration = context.resources.configuration
configuration.setLocale(locale)
return context.createConfigurationContext(configuration)
}
@Suppress("DEPRECATION")
private fun updateResourcesLegacy(context: Context, language: String?): Context {
val locale =
if (language == null){
Locale(Locale.getDefault().language)
} else {
Locale(language)
}
Locale.setDefault(locale)
val resources = context.resources
val configuration = resources.configuration
configuration.locale = locale
resources.updateConfiguration(configuration, resources.displayMetrics)
return context
}
类,并通过我的所有活动进行了扩展。然后,我调用BaseActivity
函数,该函数类似于LocaleHelper。 changeLocale
返回我的app.getSavedLanguage()
中保存的语言代码。根据用户在应用中选择的语言,此代码将被覆盖。 App是使用共享首选项的Application类。
sharedPrefs
答案 0 :(得分:0)
在这里查看我的答案(第二个): Why my app gets wrong strings from resources for localization?
要使其在Android 8和9上正常运行会有些痛苦,但是到目前为止,这对我来说一直很好。希望能帮助到你! 简而言之:您需要制作一个Locale Helper来处理所有资源的加载。您需要刷新更改语言的活动,并且在使用getResources()时可能还需要选择正确的上下文。
答案 1 :(得分:0)
我遇到了同样的问题,我始终需要为希伯来语和阿拉伯语的用户从右向左固定屏幕。 经过无数次尝试,我提出了建议的解决方案:
创建基本活动并从此类扩展您的活动。
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.view.View;
import java.util.Locale;
public abstract class Activity_Base extends AppCompatActivity {
int q = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
changeLocale(this, "iw");
Resources res = getResources();
// Change locale settings in the app.
DisplayMetrics dm = res.getDisplayMetrics();
android.content.res.Configuration conf = res.getConfiguration();
conf.setLocale(new Locale("iw")); // API 17+ only.
// Use conf.locale = new Locale(...) if targeting lower versions
res.updateConfiguration(conf, dm);
getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
Locale locale = new Locale("iw");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getApplicationContext().getResources().updateConfiguration(config, getApplicationContext().getResources().getDisplayMetrics());
super.onCreate(savedInstanceState);
}
public static void changeLocale(Context context, String locale) {
Resources res = context.getResources();
Configuration conf = res.getConfiguration();
conf.locale = new Locale(locale);
res.updateConfiguration(conf, res.getDisplayMetrics());
}
}
使用-只是扩展您的活动:
public class Activity_Article extends Activity_Base {