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

希望这对您有所帮助