Android-方向更改时强制重置区域设置

Android-方向更改时强制重置区域设置,android,locale,orientation,Android,Locale,Orientation,我尝试将应用程序中的区域设置强制为用户指定的区域设置。由于这可能用于演示,我想更改应用程序中的语言/区域设置,而不是整个设备的任何时候 我环顾四周,试图运用我在这里找到的每一个暗示。结果:我可以用新语言重新启动测试活动,但如果我更改方向,区域设置将始终重置为设备设置 我希望你能复制我的问题。请忽略用户界面的缩小,这并不重要:)是否因为您的活动在方向更改时重新启动而重置了区域设置 如果是这样,您可以拦截或阻止方向更改:我刚刚看到了您的代码 检查您使用的Locale是否来自java.util而不是a

我尝试将应用程序中的区域设置强制为用户指定的区域设置。由于这可能用于演示,我想更改应用程序中的语言/区域设置,而不是整个设备的任何时候

我环顾四周,试图运用我在这里找到的每一个暗示。结果:我可以用新语言重新启动测试活动,但如果我更改方向,区域设置将始终重置为设备设置


我希望你能复制我的问题。请忽略用户界面的缩小,这并不重要:)

是否因为您的活动在方向更改时重新启动而重置了区域设置

如果是这样,您可以拦截或阻止方向更改:

我刚刚看到了您的代码

检查您使用的
Locale
是否来自java.util而不是android。您的代码不会更改手机的区域设置

要测试它,请执行以下操作:

  • 我把手机调到西班牙语
  • 打开你的应用程序
  • 点击按钮
  • 回家
  • 图标是西班牙语而不是英语
如果您试图做的只是将区域设置设置为默认值,并且在屏幕旋转后能够看到相同的值:

而不是:

android:configChanges="locale"
使用:


这个代码片段可以满足您的需要,我已经对它进行了测试。例如,假设您希望用户能够通过主活动的菜单切换语言。您可以通过将语言标志保存为用户首选项并在“onCreate()”和“onConfigurationChanged()”上进行检查来完成此操作,如下所示:

    public class MainActivity extends Activity {

SharedPreferences mPrefs1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this);
    String languageToLoad = mPrefs1.getString("languagePref", Locale.getDefault().getLanguage());
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics());

    setContentView(R.layout.activity_main);
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
    mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this);
    String languageToLoad = mPrefs1.getString("languagePref", Locale.getDefault().getLanguage());
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics());
    setContentView(R.layout.activity_main);
}

// Declaring the Menu options
@Override
public boolean onCreateOptionsMenu(Menu menu)
{       
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    return true;
}

//handle menu item selection
public boolean onOptionsItemSelected(MenuItem item)
{
  switch (item.getItemId()) {
    case R.id.menu_switch_language:
        String languageToLoad  = getResources().getString(R.string.switch_language);

        mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = mPrefs1.edit();
        editor.putString("languagePref", languageToLoad);
        editor.commit(); // Very important to save the preference                      
        finish();
        startActivity(getIntent());
        return true;
    default:
        return super.onOptionsItemSelected(item);
  }
}   

}

您应该在应用程序::onCreate应用程序::onConfiguration更改中强制您的区域设置。
请不要忘记在AndroidManifest.xml中注册应用程序类,对我来说,有效的方法是在膨胀布局之前设置区域设置:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    String userLocale = "Wolof"; // adapt to your need
    Locale locale = new Locale(userLocale);
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());

    setContentView(R.layout.my_activity);

    ...

}
我使用finish()和startActivity()重新启动我的活动,以强制重新加载使用新区域设置的UI。方向更改始终会重置我的区域设置
Resources\updateConfiguration
已弃用,请使用
Context\createConfigurationContext(配置)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    String userLocale = "Wolof"; // adapt to your need
    Locale locale = new Locale(userLocale);
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());

    setContentView(R.layout.my_activity);

    ...

}