【问题标题】:Android - Listening to a locale change without static variablesAndroid - 在没有静态变量的情况下监听语言环境更改
【发布时间】:2016-07-07 07:14:39
【问题描述】:

我有一个BroadcastReceiver 来监听语言环境的变化。这是我的问题:

我导航到Activity,然后想通过设置应用程序更改区域设置(语言设置)。一旦进行了更改,BroadcastReceiver 就会监听 onReceive()。然后我导航回应用程序,当我这样做时,我想将用户带到另一个 Activity

此外,区域设置修改对应于配置更改,这意味着 Activity 将被销毁并再次创建。 https://developer.android.com/guide/topics/resources/runtime-changes.html

这是广播接收器:

public class LocaleReceiver extends BroadcastReceiver {
    public LocaleReceiver() {}

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.

        if(Intent.ACTION_LOCALE_CHANGED.equals(intent.getAction())){
            MainActivity.isLocaleChanged = true;
        }
    }
}

这里是使用BroadcastReceiver设置的静态变量的Activity。

public class MainActivity extends AppCompatActivity {

    public static boolean isLocaleChanged = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(isLocaleChanged){
            Intent intent = new Intent(this,SecondActivity.class);
            startActivity(intent);
            isLocaleChanged = false;
        }
    }
}

而且我确实能够导航到不同的活动!

但是,我想以不使用静态变量的方式执行此操作(因为它们是邪恶的 :()。有没有其他方法可以做到这一点。

如果没有SharedPreferences 参与,我也会特别高兴。

【问题讨论】:

  • 我有一些问题:1. 当MainActivity.isLocaleChanged = true; 完成时,您的主要活动是否在前台打开(用户可见)? 2. 更改区域设置时,您只想将用户重定向到SecondActivity ??
  • 1.不,它(和整个应用程序)在后台时完成。当 onReceive() 执行时,我会在设置应用程序中。 2. 是的。
  • 那么你只有一个选项SharedPreference,正如 Gabe Sechan 在下面的回答中所说的那样......!!

标签: android broadcastreceiver locale


【解决方案1】:

好吧,您可以关闭区域设置的配置更改,实现 onConfigurationChanged,检查更改是否针对区域设置,然后在那里启动新活动。我不确定我是否会建议它,当您返回字符串时会遇到问题。在这种情况下,您必须在非本地存储状态——无论是在静态、磁盘上(sharedPreference)还是通过状态单例或其他方式。并不是说静力学是邪恶的,而是它们可能被滥用。这是一个有意义的案例。

我实际上在这里推荐静态而不是共享首选项,因为如果您没有正确清除它并搞砸应用程序的后续执行,共享首选项可能会一直存在。静态不会,当您的应用在最坏的情况下被杀死时它会被清除。

【讨论】:

  • 谢谢。我确实尝试过使用 onConfigurationChanged() 但我似乎无法让它注册任何回调。我所做的是将 android:configChanges="locale" 添加到要在清单中注册它的 Activity 中,并且还将 onConfigurationChanged() 包含在 MainActivity 中。但它似乎并没有注册语言环境更改。什么是“关闭语言环境的配置更改” - 看起来我错过了一些东西。
  • 哇!实际上是 android:configChanges="layoutDirection|locale" stackoverflow.com/questions/18725396/… 让 onConfigChanged() 工作。不过谢谢一百万。我也明白为什么不推荐这样做。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 2021-01-08
相关资源
最近更新 更多