Android - 在 ViewPager 中支持多语言应用
Android - Support Multilanguage app in a ViewPager
我有一个带有 FragmentPagerAdapter 的 ViewPager 和从我的 MainActivity 调用的五个选项卡。我想动态更改我的应用程序的语言。为此,我在 onSavedInstanceState
中保存了我的语言偏好,如下所示:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
String predefined_lang = prefs.getString(LANGUAGES, "error");
String sub_lan = predefined_lang.substring(0,2).toLowerCase();
outState.putString(LANG, sub_lan);
System.out.println(">>saveinstance"+predefined_lang);
}
然后我从 onRestoreInstanceState
检索语言:
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Configuration configuration = getResources().getConfiguration();
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
//System.out.println(savedInstanceState.getString(LANG));
//configuration.locale = new Locale(savedInstanceState.getString(LANG));
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
String predefined_lang = prefs.getString(LANGUAGES, "error");
String sub_lan = predefined_lang.substring(0,2).toLowerCase();
configuration.locale = new Locale(savedInstanceState.getString(LANG));
getResources().updateConfiguration(configuration, displayMetrics);
System.out.println(">>onrestore"+savedInstanceState.getString(LANG));
}
所以我尽量避免在设备的默认语言中再次更改所选语言。
实际上,除了 viewPager 的选项卡名称之外,所有字符串资源都以正确的语言显示。例如:
我有这五个选项卡:
| tab1 -|- tab2 -|- tab3 -|- tab4 -|- tab5 |
如果 phone 的默认语言是 Italian
但我选择在 English
中显示应用程序,所有内容都是用英语编写的,甚至是选项卡的名称。但是当我旋转屏幕时,除了选项卡的名称之外,所有内容都保持用英语书写,而是用意大利语书写。解决方案?
您可以在方向改变时停止重新加载应用程序,方法是添加到清单中:
<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize">
</activity>
以及您的 MainActivity:
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
}
}
或者您可以指定任何其他操作,阅读有关运行时更改的更多信息:http://developer.android.com/guide/topics/resources/runtime-changes.html
希望这对您有所帮助
我有一个带有 FragmentPagerAdapter 的 ViewPager 和从我的 MainActivity 调用的五个选项卡。我想动态更改我的应用程序的语言。为此,我在 onSavedInstanceState
中保存了我的语言偏好,如下所示:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
String predefined_lang = prefs.getString(LANGUAGES, "error");
String sub_lan = predefined_lang.substring(0,2).toLowerCase();
outState.putString(LANG, sub_lan);
System.out.println(">>saveinstance"+predefined_lang);
}
然后我从 onRestoreInstanceState
检索语言:
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Configuration configuration = getResources().getConfiguration();
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
//System.out.println(savedInstanceState.getString(LANG));
//configuration.locale = new Locale(savedInstanceState.getString(LANG));
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
String predefined_lang = prefs.getString(LANGUAGES, "error");
String sub_lan = predefined_lang.substring(0,2).toLowerCase();
configuration.locale = new Locale(savedInstanceState.getString(LANG));
getResources().updateConfiguration(configuration, displayMetrics);
System.out.println(">>onrestore"+savedInstanceState.getString(LANG));
}
所以我尽量避免在设备的默认语言中再次更改所选语言。 实际上,除了 viewPager 的选项卡名称之外,所有字符串资源都以正确的语言显示。例如:
我有这五个选项卡:
| tab1 -|- tab2 -|- tab3 -|- tab4 -|- tab5 |
如果 phone 的默认语言是 Italian
但我选择在 English
中显示应用程序,所有内容都是用英语编写的,甚至是选项卡的名称。但是当我旋转屏幕时,除了选项卡的名称之外,所有内容都保持用英语书写,而是用意大利语书写。解决方案?
您可以在方向改变时停止重新加载应用程序,方法是添加到清单中:
<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize">
</activity>
以及您的 MainActivity:
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
}
}
或者您可以指定任何其他操作,阅读有关运行时更改的更多信息:http://developer.android.com/guide/topics/resources/runtime-changes.html
希望这对您有所帮助