以编程方式更改语言环境后,刷新所有活动活动(当前堆栈和后堆栈)

时间:2016-01-02 07:54:09

标签: java android android-activity locale

我想为我的用户提供应用内(NOT DEVICE-WIDE)区域设置(语言)更改。这就是为什么我设置以下代码,当用户点击特定语言时触发该代码:

private void setLocale(Locale locale) {
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config,
            getBaseContext().getResources().getDisplayMetrics());
}

到目前为止一直很好,但从现在起我还不知道如何更新/刷新我所有的活动活动(当前活动和后台堆栈中的所有活动)。我是否必须覆盖每项活动的onResume()?难道有可能概括一下吗?

2 个答案:

答案 0 :(得分:2)

我会使用诸如this one之类的Eventbus库。

您还可以创建某种设置,一个OnLocaleChangedListener接口,让所有活动(或其他类)监听更改,如下所示:

public class LocaleSettings {

    Locale locale;

    List<OnLocaleChangedListener> listeners;


    void changeLocale(Locale newLocale){

        this.locale = newLocale;

        for(OnLocaleChangedListener listener : listeners){
            listener.localeChanged(newLocale);
        }

    }

    void addListener(){

    }

    void removeListener(OnLocaleChangedListener toRemove){

    }


    interface OnLocaleChangedListener{
        void localeChanged(Locale locale);
    }
}

答案 1 :(得分:1)

如果它们都扩展Activity,您可以创建一个在onStart()中进行区域设置检查的超类。然后,您可以扩展自定义Activity,只需执行一次区域设置检查。

这样的事情:

public abstract class LocaleActivity extends Activity {
    @Override
    protected void onStart() {
        setLocale(yourLocale);
    }
}

然后,让我们说你有一个名为MainActivity的活动。您可以实现它,如下所示:

public class MainActivity extends LocaleActivity {
    //no need to override onStart, because we inherit it, whenever the user starts this activity in any way, the locale will set.
}