【问题标题】:Android: Change language android N, application instance not updatedAndroid:更改语言android N,应用程序实例未更新
【发布时间】:2018-04-15 17:50:41
【问题描述】:

我关注Android N change language programmatically 更改我的应用程序在 android N 及更高版本中的语言。但是,我仍然有应用程序上下文实例的问题。

在我的应用程序类中:

private static Application mInstance;

public static Context getApplication() {
    return mInstance;
}

@Override
public void onCreate() {
    super.onCreate();

    mInstance = this;
}

语言已更改,但从应用程序上下文获取的资源未更改。例如:

MyApplication.getApplication().getResources().getString(stringId);  

返回错误的语言字符串。

在这种情况下我可以更新应用程序实例吗?我坚持这个问题几个小时。因为 MyApplication.getApplication() 在我的应用程序中的许多地方都使用过。所以我无法转换为 Activity 上下文。

非常感谢。

【问题讨论】:

  • 在语言更改完成后再次尝试为应用程序调用 onCreate。 MyApplication.getApplication().onCreate()。或者,您可以尝试在语言更改时重新启动应用程序,这应该设置上下文。
  • 您是否在清单文件中的 application 下添加了您的 MyApplication

标签: android applicationcontext android-7.0-nougat multiple-languages


【解决方案1】:

我的一个应用程序也有同样的问题,因为我确实喜欢不需要每次都传递上下文的管理器和实用程序。

我的解决方案涉及两个独立的上下文,一个应用程序上下文和一个语言环境上下文。这并不能解决所有问题,例如使用正确的样式使用正确的语言环境进行膨胀,为此您需要使用活动上下文。但是,如果您需要根据当前语言环境从资源中获取正确的字符串或图像,那么此解决方案将起作用。

public class MainApplication extends Application {
    private static Context applicationContext;
    private static Context localeContext;

    public static Context getAppContext() {
        return applicationContext;
    }

    public static Context getLocaleContext() {
        return localeContext;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        setTheme(R.style.AppTheme);
        applicationContext = getApplicationContext();
        updateLocaleContext();
    }

    public static void updateLocaleContext() {
        localeContext = LocaleHelper.wrapContext(applicationContext);
    }
}

LocaleHelper.wrapContext 应该使用与Android N change language programmatically 上接受的答案类似的解决方案,并且所有活动都需要实现 attachBaseContext。每次语言更改时,都需要调用 MainApplication.updateLocaleContext。 注意:localeContext 不保留 onCreate 函数中设置的样式

现在您可以将 MainApplication.getLocaleContext() 用于依赖于正确语言环境的资源,而将 MainApplication.getAppContext() 用于例如膨胀不依赖于语言环境的视图。 注意:您也可以将 localeContext 放在 LocaleHelper 中以减少耦合

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2019-10-15
    • 2016-01-20
    • 1970-01-01
    相关资源
    最近更新 更多