如何在不必手动设置Android应用内的区域设置的情况下实现语言切换?我知道应用程序将在启动期间根据区域设置加载strings.xml,但我不希望根据系统区域设置进行此选择,而是在“设置”中进行用户指定。
或者,手动设置区域设置是否正常?
答案 0 :(得分:18)
你可以扩展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), "");
}
}
答案 1 :(得分:0)
好的。让我们做一个简单的方法。在“布局”文件夹中,执行2个xml布局副本。将其中一个命名为main.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();
//...`