Android - 区分配置更改

Android - differentiating between configuration changes

我正在尝试制作一个示例应用程序,它仅在语言环境更改时执行操作。我已经实施了 onConfigurationChanged(...) 并希望仅在区域设置更改时将用户重定向到不同的 Activity。监听 Locale 变化的 Activity 也监听方向变化(我在清单中已经完成)。

我的问题是,有什么方法可以区分这两个配置更改吗?

Activity 在清单中声明如下:

<activity android:name=".views.MainActivity"
              android:configChanges="layoutDirection|locale|orientation|screenSize"/>

而 onConfigurationChange(..) 方法是这样的:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // should execute only on locale change
        Intent intent = new Intent(this, SecondActivity.class);
        startActivity(intent);  
    }

您可以将区域设置保存在 SharedPreferences 中,如果区域设置已更改,则在 onConfigurationChanged 方法中进行比较。

这样使用:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    SharedPreferences prefs = getSharedPreferences(
  "yourapp", Context.MODE_PRIVATE);
    prefs.getString("locale", "DEFAULT"); 

    //newConfig.locale is deprecated since API lvl 24, you can also use newConfig.getLocales().get(0) 
    if(!locale.equalsIgnoreCase(newConfig.locale.toLanguageTag()) {
        // should execute only on locale change
        SharedPreferences settings = getSharedPreferences("yourapp", MODE_PRIVATE);
        SharedPreferences.Editor prefEditor = settings.edit();
        prefEditor.putString("locale", newConfig.locale.toLanguageTag());
        prefEditor.commit();
        Intent intent = new Intent(this, SecondActivity.class);
        startActivity(intent);  
    }
}