Android:如何更改 Android N 的语言?应用程序实例未更新。

6

我按照Android N以及以上版本中更改语言的编程方法来更改我的应用程序的语言。但是,我仍然遇到了应用程序上下文实例的问题。

在我的Application类中:

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()。 或者,您可以尝试在语言更改时重新启动应用程序,这应该设置上下文。 - jitinsharma
你在清单文件的application中添加了MyApplication吗? - AskNilesh
1个回答

0

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

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

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 中以减少耦合


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接