如何实现语言切换而无需在 Android 应用程序中手动设置语言环境?我知道应用程序将在启动期间根据语言环境加载 strings.xml,但我不希望根据系统语言环境做出此选择,而是在设置中由用户指定。
或者,手动设置语言环境好吗?
如何实现语言切换而无需在 Android 应用程序中手动设置语言环境?我知道应用程序将在启动期间根据语言环境加载 strings.xml,但我不希望根据系统语言环境做出此选择,而是在设置中由用户指定。
或者,手动设置语言环境好吗?
您可以扩展 Application 类(您也必须在清单中声明它)并将类似的内容放入其中。
每当您想更改语言时,您都可以致电
((App)getApplicationContext()).changeLang(lang);
从你的活动中。R.string.locale_lang 只是存储在 strings.xml 中用于共享首选项的键
public class App extends Application {
private Locale locale = null;
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (locale != null) {
Locale.setDefault(locale);
Configuration config = new Configuration(newConfig);
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
}
}
@Override
public void onCreate() {
super.onCreate();
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
String lang = settings.getString(getString(R.string.locale_lang), "");
changeLang(lang);
}
public void changeLang(String lang) {
Configuration config = getBaseContext().getResources().getConfiguration();
if (!"".equals(lang) && !config.locale.getLanguage().equals(lang)) {
Editor ed = PreferenceManager.getDefaultSharedPreferences(this).edit();
ed.putString(getString(R.string.locale_lang), lang);
ed.commit();
locale = new Locale(lang);
Locale.setDefault(locale);
Configuration conf = new Configuration(config);
conf.locale = locale;
getBaseContext().getResources().updateConfiguration(conf, getBaseContext().getResources().getDisplayMetrics());
}
}
public String getLang(){
return PreferenceManager.getDefaultSharedPreferences(this).getString(this.getString(R.string.locale_lang), "");
}
}
好的。让我们做一个简单的方法。在您的布局文件夹中,复制 2 个 xml 布局。其中一个命名为 main.xml(您的本地语言),另一个命名为 mainen.xml 为英语。在 values 文件夹中,strings.xml 文件还包含两种语言的两行文本:<string name="hello">Tere, Maailm!</string>
本地语言和<string name="hello_en">Hello World!</string>
英语。回到 xml 布局,main.xml 包含android:text="@string/hello"
您的文本,第二个重复的 mainen.xml 包含所有相同的布局和字符串,与从 strings.xml 文件中检索文本行的英文版本略有不同:android:text="@string/hello_en"
. 并且以编程方式,在需要时设置标题并在每个活动的开头指定要选择的布局,使用全局变量 languageToLoad,该变量已在您的第一个(起始)类中声明和实例化:protected static boolean languageToLoad = true;
,在同一个类中onCreate 方法应该包含一些单选按钮(您还需要在相应的布局 xml 中定义和命名它们):`
// ...
View radio1 = findViewById(R.id.Et);
radio1.setOnClickListener(this);
View radio2 = findViewById(R.id.En);
radio2.setOnClickListener(this);
// ...`
后来在课堂上:`
// ...
public void onClick(View v1) {
switch (v1.getId()) {
case R.id.Et:
languageToLoad = true;
break;
case R.id.En:
languageToLoad = false;
break;
// ...`
稍后在程序中,在您不同活动的 onCreate 方法中:`
//...
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (YourSuperClass.languageToLoad) {
setContentView(R.layout.youractivity); // estonian
setTitle(R.string.youractivity_title);
} else {
setContentView(R.layout.youractivityen); // english
setTitle(R.string.youractivity_title_en);
}
Intent i = getIntent();
//...`