android - 如何在所有活动中更改我的应用程序的语言?
问题描述
我已经在第一个 Activity 中成功更改了我的应用程序的语言.. 但是通过移动到另一个 Activity,我发现语言没有改变。
请注意,我使用以下代码更改语言
public static final String languageFile="language_file";
SharedPreferences myLang;
private Locale Language;
String defaultLanguage="en";
String language1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
myLang = getSharedPreferences(languageFile, Context.MODE_PRIVATE);
language1=myLang.getString("language",defaultLanguage).toString();
setLocale(language1);
}
public void setLocale(String lang) {
Language = new Locale(lang);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = Language;
res.updateConfiguration(conf, dm);
Intent refresh = new Intent(this,Welcome_Activity.class);
startActivity(refresh);
finish();
}
我使用了一个对话框来选择语言并将其放入共享首选项中,如下所示
public void changeLanguage(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder
// .setIcon(android.R.drawable.ic_dialog_alert)
.setTitle(R.string.LanguageSelector)
.setMessage(R.string.Pleaseselectyourlanguage)
.setPositiveButton("English", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int
which) {
setLocale("en");
myLang=getSharedPreferences(languageFile,Context.MODE_PRIVATE);
SharedPreferences.Editor editor=myLang.edit();
editor.putString("language", "en").apply();
}
})
.setNegativeButton("عربي", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setLocale("ar");
myLang=getSharedPreferences(languageFile,Context.MODE_PRIVATE);
SharedPreferences.Editor editor=myLang.edit();
editor.putString("language", "ar").apply();
}
});
AlertDialog alert = builder.create();
alert.show();
Button nbutton = alert.getButton(DialogInterface.BUTTON_NEGATIVE);
nbutton.setTextColor(Color.BLACK);
Button pbutton = alert.getButton(DialogInterface.BUTTON_POSITIVE);
pbutton.setTextColor(Color.BLACK);
}
解决方案
您所要做的就是创建一个 BaseClass 并使用 Base 类扩展您的所有活动
public class MainActivity extends BaseActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
/**
* @author Atif Abbasi .
*/
public class BaseActivity extends AppCompatActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(LocaleHelper.wrap(newBase, AppClass.getLanguage(newBase)));
/**
*save value in sharedPrefrences
*
*AppClass.getLanguage(newBase)
*
*
**/
}
/**
* A locale helper class for updating app specific locale
*/
private static class LocaleHelper extends ContextWrapper {
public LocaleHelper(Context base) {
super(base);
}
public static ContextWrapper wrap(Context context, String language) {
if (TextUtils.isEmpty(language.trim())) {
return new LocaleHelper(context);
}
Configuration config = context.getResources().getConfiguration();
Locale locale = new Locale(language);
Locale.setDefault(locale);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
config.setLocale(locale);
} else {
//noinspection deprecation
config.locale = locale;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
config.setLayoutDirection(locale);
context = context.createConfigurationContext(config);
} else {
//noinspection deprecation
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
}
return new LocaleHelper(context);
}
} // LocaleHelper
}
推荐阅读
- ios - 谷歌地图 - 如何找出用户的位置并在 Swift 中显示从该位置到目的地点的路线?
- ethernet - 通过以太网交换消息
- python - 将新数据引入经过训练和恢复的 TensorFlow 模型后的不良结果
- jekyll - 是否可以验证链接(或字符串)是否与任何有效的 Jekyll 永久链接匹配?
- unicode - Wildfly 13.0.0.Final 错误 UT005014:无法解析请求:io.undertow.util.BadRequestException:UT000165:请求目标中的字符 ä 无效
- windows - 进程 lsass.exe 在 windows server 2016 中消耗大量网络资源
- java - 重定向 URI 不匹配 - 获取 Google 访问令牌 (OAuth 2)
- javascript - 如何使用固定元素使 SVG 具有响应性?
- python - 如何连接/加入这三个数据框
- javascript - 如何在 Vuex 商店中提交突变,来自 Vuetify 列表,VueJS